0

我刚开始使用 wxPython,这就是我想做的:

a) 显示一个框架(其中有面板)和该面板上的一个按钮。b)当我按下按钮时,会弹出一个对话框(我可以从中选择)。c) 当我在对话框上按 ok 时,对话框应该消失(销毁),但原来的 Frame+Panel+button 仍然存在。d) 如果我再次按下该按钮,对话框将重新出现。

我的代码如下。不幸的是,我得到了相反的效果。那是,

a) 选择对话框首先出现(即,没有点击任何按钮,因为 TopLevelframe+按钮从未显示)。

b)当我在对话框上单击确定时,会出现带有按钮的框架。

c) 再次点击按钮无效(即对话框不再出现)。

我究竟做错了什么 ?似乎一旦初始化框架(甚至在调用 .Show() 之前),对话框就会被初始化并自动显示。

我正在使用带有 Python 2.6 的 WindowsXP 上的 Eclipse+Pydev 执行此操作

============文件:MainFile.py===============

import wx
import MyDialog   #This is implemented in another file: MyDialog.py

class TopLevelFrame(wx.Frame):

    def __init__(self,parent,id):    
        wx.Frame.__init__(self,parent,id,"Test",size=(300,200))
        panel=wx.Panel(self)
        button=wx.Button(panel, label='Show Dialog', pos=(130,20), size=(60,20))

        # Bind EVENTS --> HANDLERS. 
        button.Bind(wx.EVT_BUTTON, MyDialog.start(self))  


# Run the main loop to start program.         
if __name__=='__main__':
    app=wx.PySimpleApp()    
    TopLevelFrame(parent=None, id=-1).Show()  
    app.MainLoop()

============文件:MyDialog.py===============

import wx

def start(parent):
    inputbox = wx.SingleChoiceDialog(None,'Choose Fruit', 'Selection Title',
                                     ['apple','banana','orange','papaya'])
    if inputbox.ShowModal()==wx.ID_OK:
        answer = inputbox.GetStringSelection()
        inputbox.Destroy()
4

1 回答 1

3

有很多方法可以做到这一点,但要对代码进行最少的更改,

更改def start(parent):

def start(parent, evt):

并更改button.Bind(wx.EVT_BUTTON, MyDialog.start(self))

    button.Bind(wx.EVT_BUTTON, lambda evt: MyDialog.start(self, evt))

即Bind中的第二个参数需要是一个接受和事件的函数,并且需要在点击按钮时创建对话框。 lambda使它成为一个也接受 parent 和 evt 的函数(您也可以使用 functools.partial 版本> 2.5),然后当单击按钮时,start将调用以创建对话框。

我不太确定您的代码中发生了什么,但似乎您在start对 Bind 的初始调用中调用并创建了对话框,然后将返回值从开始传递None到 Bind。

注意 1 更详细地说,这里使用 lambda 的原因是 Bind 应该具有类似于 wx.PyEventBinder 的形式,类似于Bind(event, handler)wx.EVT_BUTTON event,并且handler是类似于 foo(evt) 的函数,其中 evt 是 wx.Event 或wx.CommandEvent。(这里没有递归,因为你只是说当某事发生时该怎么做,但那件事还没有发生,所以事件还没有创建。当事件发生时,它将由 wx 表示.Event,它将包含有关事件的信息,例如单击鼠标时鼠标的位置等)

注2 在我的回答中,我试图以最小的变化来回答您的问题,因为我认为这将是最简单的。也许下面的代码更清晰(也许在创建它们的小部件中处理事件通常是最清晰的):

def start2(parent):
    inputbox = wx.SingleChoiceDialog(parent,'Choose Fruit', 'Selection Title',
                                     ['apple','banana','orange','papaya'])
    if inputbox.ShowModal()==wx.ID_OK:
        answer = inputbox.GetStringSelection()
    inputbox.Destroy()

class TopLevelFrame2(wx.Frame):

    def __init__(self,parent,id):    
        wx.Frame.__init__(self,parent,id,"Test",size=(300,200))
        panel=wx.Panel(self)
        button=wx.Button(panel, label='Show Dialog', pos=(130,20), size=(60,20))

        # Bind EVENTS --> HANDLERS. 
        button.Bind(wx.EVT_BUTTON, self.OnClick)  

    def OnClick(self, evt):
        start2(self)
于 2010-04-26T18:55:53.667 回答