将wx.Frame类的值传递给python中的wx.Dialog类

时间:2016-03-30 06:08:41

标签: python wxpython

我是python的新手。我目前正在创建一个有4个选项的GUI。这意味着一个问题和相应的4个选择。用户将选择1个选项,当单击确定时,它将显示自定义对话框并告诉您答案是否正确

import wx

class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, -1, "My Frame", size=(3000, 3000))
        panel = wx.Panel(self,-1)
        #panel.Bind(wx.EVT_MOTION,  self.OnMove)
        wx.StaticText(panel, -1, "What are the values of X", pos=(10, 12))
        #self.posCtrl = wx.TextCtrl(panel, -1, "", pos=(100, 10))
        self.option1 = wx.CheckBox(panel, -1, "Apples", (20,100), (160,-1))
        wx.CheckBox(panel, -1, "Mango", (20,150), (160,-1))
        wx.CheckBox(panel, -1, "Banana", (20,200), (160,-1))
        wx.CheckBox(panel, -1, "Orange", (20,250), (160,-1))
        button=wx.Button(panel,label="OK",pos=(800, 400), size = (50,50))
        self.Bind(wx.EVT_BUTTON, self.newwindow, button)


    # def OnMove(self, event):
        # pos = event.GetPosition()
        # self.posCtrl.SetValue("%s, %s" % (pos.x, pos.y))


    def newwindow(self, event):
        dia = MyDialog(None, -1, 'buttons')
        dia.ShowModal()
        dia.Destroy()



class MyDialog(wx.Dialog):
    def __init__(self, parent, id, title):
        wx.Dialog.__init__(self, parent, id, title, size=(350,300)
        value = MyFrame.self.option1.GetValue()
        print ("***** Value is" , value)
app = wx.App(False)
frame = MyFrame()
frame.Show(True)
app.MainLoop()

我收到错误。如何获取用户选择的checkBox的值,并将相同的返回值传递给Dialog类

1 个答案:

答案 0 :(得分:0)

首先为wx.Dialog

做适当的养育
def newwindow(self, event):
    dia = MyDialog(self, -1, 'buttons') # refer to instance of MyFrame parent

一旦这样做,您就可以在对话框中获得对父框架的引用,并且可以使用它:

class MyDialog(wx.Dialog):
    def __init__(self, parent, id, title):
        # ...
        value = parent.option1.GetValue() # parent is instance of MyFrame
        print ("***** Value is" , value)

正如@dpwilson所提到的,尝试访问类(MyFrame)而不是类(frame)的实例是不合适的。

我认为更好的做法是将MyFrame实例明确地传递("显式优于隐式")到wx.Dialog(例如,使用parent)而不是试图依赖全局变量frame。如果您从其他模块导入frame / MyFrame,则MyDialog将不会出现。

相关问题