2011-12-19 3 views
0

나는 파이썬 언어의 초보자이며 wxpython을 사용하여 내 프로그램을위한 간단한 GUI를 만들려고 노력 중이다. 내 GUI는 프레임과 두 개의 탭 (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

예를 들어 불필요한 코드를 잘라내어 간단한 예를 작성하면 더 좋을 것입니다. on panel.field1의 click 값을 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() 

를 제거하지 마십시오 PageOne에 PageTwo를 전달하십시오.

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) 

당신은 당신이 제대로 페이지 2의 값에 액세스 할 수 있어야합니다 이러한 변경을 수행 한,하지만 당신은 당신이 뭘 하려는지에 대한 자세한 내용을 생각해야했다하면? 당신에게,

  • 더 나은 방법 페이지 일부 모델/객체에 값을 저장하게하는 것입니다 당신이 어떻게 든 처리하기 전에 오류 및 깨끗한 데이터를 표시 할 수 있기 때문에 다른 페이지가 직접 UI 요소에 액세스하는 대신 해당 데이터에 액세스 할 수 있습니다

  • 대신 텍스트 1의 더 나은 변수 이름이 탭의 변화에 ​​그렇게 할 수 self.textX 또는 self.X는 등

  • 당신은 세 번째 클래스에 계산 기능을 분리해야 사용하거나 메인 프레임, PAGE1 페이지 2 될 수있다 데이터 만 수집해야합니다.

+0

Anurag, 답장을 보내 주셔서 감사합니다. 계산 전에 텍스트 파일에 데이터를 저장하려고합니다. (모델/개체 또는 데이터베이스를 말한 것 같습니다) –

+0

@HakanTunca NO 텍스트에 저장하지 마세요. 파일 또는 db를 저장해야하는 경우가 아니라면 파이썬에서 값을 설정하고 가져올 수있는 간단한 모델 클래스가 될 수 있으므로 이후에는 MVC라고하는 다양한 작업을 수행 할 수 있습니다. –

+0

오케이, 의미가 있습니다. –

0

그런 곳에서 wxPython을 가져 오는 아이디어를 얻었습니까? 저도 놀랍습니다. 당신은 이런 식으로 할 생각됩니다

import wx 

당신이 그것을하고있는 방법은 5 년 이상 오래 전에 wxPython을 2.6에서 온다. 당신도 정말로 다른 화면에서 정보를 가져 오지 말아야합니다. 다른 동료 (페이지 1 즉 통과 2 페이지) 해결 방법으로 언급 한 바와 같이 당신은 할 수있다 또는 당신은이 작업을 수행 할 수 있습니다 wx.PySimpleApp 지금은 사용되지 않는 것을

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() 

주, 그래서 나는 WX 위해 그것을 밖으로 교환.App (False)

개인적으로 모든 데이터 항목을 하나의 화면에 저장하거나 데이터베이스에 저장하거나 소켓 서버를 사용하거나 pubsub를 사용하여 데이터를 전달합니다 (어떤 종류의 이벤트가 발생해야 함). 노트북 변경 이벤트와 같은 2 페이지). 위의 코드는 해킹이며 매우 부서지기는하지만 을 처리합니다.

+0

친애하는 Mike에게 큰 반찬을 보내 주셔서 대단히 감사합니다. 탭 문제를 더 분명히 이해하는 데 도움이되었습니다. 나는 "통과하는"기술을 다른 방식으로 적용 할 수 있다는 것을 알고 있습니다. 초보자 인 저는 Python 2.6의 아주 초기 버전부터 시작했습니다 :) 저는 여러분과 Anurag의 제안을 적용하고 데이터를 데이터베이스에 저장하려고합니다. 친애하는. –