2011-12-19 9 views
0

私はPython言語の初心者です。私はwxpythonを使用して私のプログラムのための簡単なGUIを作ろうとしています。私のguiはフレームと2つのタブ(wxPanelを使用)で構成されています(タブ1とタブ2)。私はタブ1とタブ2の両方にtxtctrlウィジェットを配置しました。タブ1では、すべてのtxtctrl値を取得し、対応する変数に割り当てるボタンを配置しました。私の問題は、私はタブ1パネルに配置され、タブ1の変数に割り当てるtxtctrlsから値を取得できますが、タブ2パネルにあるtxtctrlsから値を取得することはできず、タブ1パネルで使用します私はタブ2のパネルから値を取得し、それらをタブ1のパネルの変数に割り当てる必要があります。)この問題を解決してコードを実行するのを手伝ってください。クリックすると、パネル2のデータはパネル1のフィールドにコピーされますか?

私は多くのサイトを検索し、フレームやクラス間のデータ転送に関するサンプルを読んで適用しようとしましたが、それでも動作させることはできませんでした。

ここは私のGUIコードです。すでにメインフレームでそれを作成したとき

from wxPython.wx import * 
import os 

class PageOne(wxPanel): 
    def __init__(self, parent): 
     wxPanel.__init__(self, parent) 
     self.SetBackgroundColour("gray") 

     self.tc1=wxTextCtrl(self, -1, '', (110, 15), (120, -1)) 
     self.tc2=wxTextCtrl(self, -1, '', (110, 15), (120, -1)) 
     self.tc3=wxTextCtrl(self, -1, '', (110, 15), (120, -1)) 
     self.st1=wxStaticText(self, -1, "input", pos=(10, 12)) 
     self.st2=wxStaticText(self, -1, "X:", pos=(10, 12)) 
     self.st3=wxStaticText(self, -1, "Y:", pos=(10, 12)) 
     self.st4=wxStaticText(self, -1, "Z:", pos=(10, 12)) 
     #flexgrid 
     self.fgs = wxFlexGridSizer(1, 7, 9, 10) 
     self.fgs.AddMany([(self.st1, 1, wxEXPAND),(self.st2, 1, \ 
     wxEXPAND),(self.tc1, 1,wxEXPAND),(self.st3, 1, wxEXPAND),\ 
     (self.tc2, 1, wxEXPAND),(self.st4, 1, wxEXPAND),(self.tc3, 1,\ 
     wxEXPAND)]) 
     # statik text 
     self.hsizer1 = wxBoxSizer(wxHORIZONTAL) 
     self.hsizer2 = wxBoxSizer(wxHORIZONTAL) 
     self.vsizerb = wxBoxSizer(wxVERTICAL) 

     self.hsizer1.Add(self.fgs, 1, wxEXPAND |wxALIGN_CENTER| wxALL,1) 

     self.but1=wxButton(self, 1, 'Calculate', (10, 10)) 
     self.but1.Bind(EVT_BUTTON, self.Create_OnClick) 
     self.hsizer2.Add(self.but1, 1, wxALIGN_CENTER) 

     self.vsizerb.Add(self.hsizer1, 1.8, wxEXPAND | wxALL, 10) 
     self.vsizerb.Add(self.hsizer2, 0.2, wxEXPAND | wxALL, 10) 
     self.SetSizer(self.vsizerb) 

     self.PTWO=PageTwo(self) 
     self.PTWO.Show() 

    def Create_OnClick(self, event): 
     text1=self.tc1.GetValue() 
     text2=self.tc2.GetValue() 
     text3=self.tc3.GetValue() 
     #here I want to get pt2_1 value from tab2 panel and assign it 
     #to text4 varibale. 
     #on the gui, if you fill all txtcrtl boxes and press calculate 
     #button, it gives values of text3 and text4 on cmd. 
     #I can get text3 value but cannot get text4 value.It gives null? 
     text4=self.PTWO.pt2_1.GetValue() 
     print "text_fromtab2:",text4,"text_fromtab1:",text3 
     yer=os.getcwd() 

class PageTwo(wxPanel): 
    def __init__(self, parent): 
     wxPanel.__init__(self, parent) 
     self.SetBackgroundColour("gray") 

     self.hsizerb = wxBoxSizer(wxHORIZONTAL) 
     self.st5=wxStaticText(self, -1, "Input 1 (mm)", pos=(10, 12)) 
     # I want to be able to get these values from PageOne 
     self.pt2_1=wxTextCtrl(self, -1, '', (110, 15), (120, -1)) 

     self.fgs_pt2 = wxFlexGridSizer(1, 2, 10, 10) 
     self.fgs_pt2.AddMany([(self.st5, 1, wxEXPAND),(self.pt2_1, 1,\ 
     wxEXPAND)]) 
     self.hsizerb.Add(self.fgs_pt2, 1, wxEXPAND |wxALIGN_CENTER| \ 
     wxALL, 10) 
     self.SetSizer(self.hsizerb) 

class MainFrame(wxFrame): 
    def __init__(self, parent, fid, title): 
     wxFrame.__init__(self, parent, fid, title, \ 
      pos = (200, 50), \ 
      size = (500, 200), \ 
      style = wxDEFAULT_FRAME_STYLE \ 
       |wxNO_FULL_REPAINT_ON_RESIZE) 

     panel1 = wxPanel(self, -1) 
     panel1.SetBackgroundColour("blue") 

     nb = wxNotebook(panel1) 
     page1 = PageOne(nb) 
     page2 = PageTwo(nb) 

     nb.AddPage(page1, "Tab 1") 
     nb.AddPage(page2, "Tab 2") 

     sizer = wxBoxSizer(wxVERTICAL) 
     sizer.Add(nb, 1, wxALL|wxALIGN_CENTER|wxEXPAND, 1) 
     panel1.SetSizer(sizer) 
     panel1.SetAutoLayout(True) 
     self.Show(True) 

if __name__ == "__main__": 
     app = wxPySimpleApp() 
     frame = MainFrame(None, wxID_ANY, "MY PROGRAM") 
     app.MainLoop() 
+2

不要なコードを削除して、より簡単な例を作成してください。 Panel.field1のクリック時の値はpanel2.field2にコピーする必要がありますか? –

+0

Anurag、あなたの助言に感謝します。あなたが示唆したように、私は不要なコードを削除しようとし、それを簡単にしました。 –

答えて

0

あなたは、二回PageTwoを作成している

nb = wxNotebook(panel1) 
page1 = PageOne(nb) 
page2 = PageTwo(nb) 

nb.AddPage(page1, "Tab 1") 
nb.AddPage(page2, "Tab 2") 

あなたはPageOneでそれを再作成する必要があるので、代わりにこの

self.PTWO=PageTwo(self) 
self.PTWO.Show() 

を削除しないでくださいページPageTwoをPageOneに渡す

class PageOne(wxPanel): 
    def __init__(self, parent, page2): 
     wxPanel.__init__(self, parent) 
     self.PTWO=page2 

とメインフレームで

nb = wxNotebook(panel1) 
page2 = PageTwo(nb) 
page1 = PageOne(nb, page2) 

あなたは正しくPAGE2から値にアクセスすることができるはずですこれらの変更を行っているが、それはあなたがやろうとしているものについての詳細を考える必要があると述べたら?あなたは、

  • 良い方法はページは、いくつかのモデル/オブジェクトに値を保存できるようになり、あなたがとにかく処理する前に、エラーとクリーンなデータを表示する必要があるかもしれないので、他のページには、直接UI要素にアクセスするのではなく、そのデータにアクセスすることができますそれを行うことができ、タブの変化に

  • ではなく、テキスト1のより良い変数名を持っているあなたは第三のクラスに演算機能を分離すべきか、メインフレームであってもよいし、ページ1とページ2

  • self.textXまたはself.Xなどを使用データのみを収集する必要があります

+0

Anurag、ご回答いただきありがとうございます。計算前にテキストファイルにデータを保存しようとしています(モデル/オブジェクトまたはデータベースと言っていると思います) –

+0

@HakanTuncaいいえ、テキストに保存しませんあなたがデータを保存する必要がない限り、私はあなたが設定し値を取得できるPythonの単純なモデルクラスであることを意味するので、後でMVCといっていろいろなことを行うことができます。 –

+0

大丈夫です。 –

0

あなたはwxPythonをそのようにインポートするアイディアをどこで手に入れましたか?私は驚いていても動作します。あなたがこのようにそれを行うことになっています

import wx 

あなたはそれをやっている方法は、以上の5歳wxPythonの2.6または前に、から来ています。あなたは本当にそのような他の画面から情報を引き出すべきではありません。 wx.PySimpleAppが廃止、私はWXのためにそれをスワップアウトされていることを

import wx 
import os 

class PageOne(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.SetBackgroundColour("gray") 

     self.tc1=wx.TextCtrl(self, -1, '', (110, 15), (120, -1)) 
     self.tc2=wx.TextCtrl(self, -1, '', (110, 15), (120, -1)) 
     self.tc3=wx.TextCtrl(self, -1, '', (110, 15), (120, -1)) 
     self.st1=wx.StaticText(self, -1, "input", pos=(10, 12)) 
     self.st2=wx.StaticText(self, -1, "X:", pos=(10, 12)) 
     self.st3=wx.StaticText(self, -1, "Y:", pos=(10, 12)) 
     self.st4=wx.StaticText(self, -1, "Z:", pos=(10, 12)) 
     #flexgrid 
     self.fgs = wx.FlexGridSizer(1, 7, 9, 10) 
     self.fgs.AddMany([(self.st1, 1, wx.EXPAND), 
          (self.st2, 1, wx.EXPAND), 
          (self.tc1, 1,wx.EXPAND), 
          (self.st3, 1, wx.EXPAND), 
          (self.tc2, 1, wx.EXPAND), 
          (self.st4, 1, wx.EXPAND), 
          (self.tc3, 1, wx.EXPAND)]) 
     # statik text 
     self.hsizer1 = wx.BoxSizer(wx.HORIZONTAL) 
     self.hsizer2 = wx.BoxSizer(wx.HORIZONTAL) 
     self.vsizerb = wx.BoxSizer(wx.VERTICAL) 

     self.hsizer1.Add(self.fgs, 1, wx.EXPAND |wx.ALIGN_CENTER| wx.ALL,1) 

     self.but1=wx.Button(self, 1, 'Calculate', (10, 10)) 
     self.but1.Bind(wx.EVT_BUTTON, self.Create_OnClick) 
     self.hsizer2.Add(self.but1, 1, wx.ALIGN_CENTER) 

     self.vsizerb.Add(self.hsizer1, 1.8, wx.EXPAND | wx.ALL, 10) 
     self.vsizerb.Add(self.hsizer2, 0.2, wx.EXPAND | wx.ALL, 10) 
     self.SetSizer(self.vsizerb) 

    def Create_OnClick(self, event): 
     text1=self.tc1.GetValue() 
     text2=self.tc2.GetValue() 
     text3=self.tc3.GetValue() 
     #here I want to get pt2_1 value from tab2 panel and assign it 
     #to text4 varibale. 
     #on the gui, if you fill all txtcrtl boxes and press calculate 
     #button, it gives values of text3 and text4 on cmd. 
     #I can get text3 value but cannot get text4 value.It gives null? 
     notebook = self.GetParent() 
     pageTwo = notebook.page2 
     text4=pageTwo.pt2_1.GetValue() 
     print "text_fromtab2:",text4,"text_fromtab1:",text3 
     yer=os.getcwd() 

class PageTwo(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.SetBackgroundColour("gray") 

     self.hsizerb = wx.BoxSizer(wx.HORIZONTAL) 
     self.st5=wx.StaticText(self, -1, "Input 1 (mm)", pos=(10, 12)) 
     # I want to be able to get these values from PageOne 
     self.pt2_1=wx.TextCtrl(self, -1, '', (110, 15), (120, -1)) 

     self.fgs_pt2 = wx.FlexGridSizer(1, 2, 10, 10) 
     self.fgs_pt2.AddMany([(self.st5, 1, wx.EXPAND), 
           (self.pt2_1, 1, wx.EXPAND)]) 
     self.hsizerb.Add(self.fgs_pt2, 1, wx.EXPAND |wx.ALIGN_CENTER|wx.ALL, 10) 
     self.SetSizer(self.hsizerb) 

class MyNotebook(wx.Notebook): 
    def __init__(self, parent): 
     wx.Notebook.__init__(self, parent) 
     self.page1 = PageOne(self) 
     self.page2 = PageTwo(self) 

     self.AddPage(self.page1, "Tab 1") 
     self.AddPage(self.page2, "Tab 2") 


class MainFrame(wx.Frame): 
    def __init__(self, parent, fid, title): 
     wx.Frame.__init__(self, parent, fid, title, \ 
      pos = (200, 50), \ 
      size = (500, 200), \ 
      style = wx.DEFAULT_FRAME_STYLE \ 
       |wx.NO_FULL_REPAINT_ON_RESIZE) 

     panel1 = wx.Panel(self, -1) 
     panel1.SetBackgroundColour("blue") 

     nb = MyNotebook(panel1) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(nb, 1, wx.ALL|wx.ALIGN_CENTER|wx.EXPAND, 1) 
     panel1.SetSizer(sizer) 
     panel1.SetAutoLayout(True) 
     self.Show(True) 

if __name__ == "__main__": 
     app = wx.App(False) 
     frame = MainFrame(None, wx.ID_ANY, "MY PROGRAM") 
     app.MainLoop() 

注:あなたは他の仲間(のページ1へ、すなわち通過ページ2)回避策として挙げたか、あなたがこれを行うことができますように行うことができます。アプリケーション(偽)

個人的には、私はちょうど1つの画面にデータを入れるか、データベースに保存するか、ソケットサーバーを使用するか、pubsubを使ってデータを渡します。 2ページ目、ノートブックの変更イベントなど)。上記のコードはハックで、かなり脆いですが、になります。

+0

親愛なるマイクさん、本当にありがとうございました。それはタブの問題をより明確に理解するのに役立ちました。私は別の方法で "合格"テクニックを適用することができますが、それは素晴らしいことです。私は初心者であり、Python 2.6の非常に初期のバージョンから始めました:)あなたとAnuragの提案を適用し、データをデータベースに入れようとします。あなたは敬意を表します。 –

関連する問題