wxpython,基本UI错误,按钮和列表框冲突?

时间:2011-10-30 19:51:34

标签: python wxpython

我遇到了wxpython的问题。当我运行以下代码时,它将以小的形式显示列表框(它将仅显示大约10x10的列表框)。我不知道为什么会这样,网上没有太多资源来帮助我。如果我不添加任何按钮,列表框将正确显示。请原谅我,如果这是一个简单的解决方案,但我真的很难过。如果你不明白我的问题是什么,请运行以下代码,你会看到。

import wx

class MyFrame(wx.Frame):
    """make a frame, inherits wx.Frame"""
    def __init__(self,parent,id):

        # create a frame, no parent, default to wxID_ANY
        wx.Frame.__init__(self, parent, id, 'Testing',
            pos=(300, 150), size=(600, 500))
        panel = wx.Panel(self)
        sampleList = ['dsakdsko0', '1', '2', '3', '4']
        listBox = wx.ListBox(panel, -1, (4,3), (100, 60), sampleList, wx.LB_SINGLE)
        listBox.SetSelection(3)

        self.SetBackgroundColour("white")

        wx.Button(self, 1, 'Close', (50, 130))
        wx.Button(self, 2, 'Random Move', (150, 130), (110, -1))

        self.Bind(wx.EVT_BUTTON, self.OnClose, id=1)
        self.Bind(wx.EVT_BUTTON, self.OnRandomMove, id=2)

        # show the frame
        self.Show(True)
        #menu bar
        status=self.CreateStatusBar()
        menubar=wx.MenuBar()
        first=wx.Menu()
        second=wx.Menu()
        first.Append(wx.NewId(),"New","Creates A new file")
        first.Append(wx.NewId(),"ADID","Yo")
        menubar.Append(first,"File")
        menubar.Append(second,"Edit")
        self.SetMenuBar(menubar)

    def OnClose(self, event):
        self.Close(True)

    def OnRandomMove(self, event):
        screensize = wx.GetDisplaySize()
        randx = random.randrange(0, screensize.x - APP_SIZE_X)
        randy = random.randrange(0, screensize.y - APP_SIZE_Y)
        self.Move((randx, randy))

if __name__=='__main__':
    application = wx.PySimpleApp()
    frame=MyFrame(parent=None,id=-1)
    frame.Show()
    # start the event loop
    application.MainLoop()

非常感谢你。

1 个答案:

答案 0 :(得分:0)

问题涉及父母。您的按钮的父级是框架,而列表框的父级是面板。也可以将面板作为父级按钮给出,问题就会消失。顺便说一下,分配自己的ID号通常不是一个好主意,特别是那些可能会被使用的ID号。但如果你真的想,那么请遵循Robin Dunn的wxPython书中的这些说明:

“您可以通过调用全局函数wx.RegisterId()来确保wxPython不在应用程序的其他位置使用您的显式ID。为了防止程序重复wxPython ID,你应该避免在全局常量wx.ID_LOWEST和wx.ID_HIGHEST之间使用ID号。“

编辑:以下是一个类别的例子:

改变这个:

wx.Button(self, 1, 'Close', (50, 130))
wx.Button(self, 2, 'Random Move', (150, 130), (110, -1))

到此:

wx.Button(panel, 1, 'Close', (50, 130))
wx.Button(panel, 2, 'Random Move', (150, 130), (110, -1))

然后注册您的ID:

wx.RegisterId(1)
wx.RegisterId(2)

就个人而言,我只想创建这样的按钮:

closeBtn = wx.Button(panel, wx.ID_ANY, 'Close', (50, 130))
self.Bind(wx.EVT_BUTTON, self.OnClose, closeBtn)
randomBtn = wx.Button(panel, wx.ID_ANY, 'Random Move', (150, 130), (110, -1))
self.Bind(wx.EVT_BUTTON, self.OnRandomMove, randomBtn)