wxPython - 框架在编程时不会打开

时间:2015-02-11 17:00:47

标签: user-interface wxpython python-2.6

当我运行以下程序时,我得到的只是一个小窗口和一个小文本框(文本框),根据程序,它应该是一个大窗口,更大的文本框和两个按钮。

import wx

class FirstFrame(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,id,'PIZZA', size=(400,400))
        self.sizer = wx.FlexGridSizer(2,2,5,5)
        panel=wx.Panel(self,-1)
        self.button1 = wx.Button(panel,id=-1,label='Click Me!', size=(20,20))
        self.textbox = wx.TextCtrl(panel,id=-1,size=(50,50))
        self.button2 = wx.Button(panel,-1,'Click Me Too!',size=(20,20))
        #trying to use the boxer...
        self.sizer.Add(self.textbox)
        self.sizer.Add(self.button1)
        self.sizer.Add(self.button2)
        self.SetSizerAndFit(self.sizer)

class MyGame(wx.App):
    def OnInit(self):
        frame=FirstFrame(None,-1,"wx")
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app=MyGame()
app.MainLoop()

3 个答案:

答案 0 :(得分:0)

您可能想要的是将__init__中的最后一行更改为以下内容:

panel.SetSizerAndFit(self.sizer)

以下是上下文中的代码:

import wx

class FirstFrame(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,id,'PIZZA', size=(400,400))
        self.sizer = wx.FlexGridSizer(2,2,5,5)
        panel=wx.Panel(self,-1)
        self.button1 = wx.Button(panel,id=-1,label='Click Me!', size=(20,20))
        self.textbox = wx.TextCtrl(panel,id=-1,size=(50,50))
        self.button2 = wx.Button(panel,-1,'Click Me Too!',size=(20,20))
        #trying to use the boxer...
        self.sizer.Add(self.textbox)
        self.sizer.Add(self.button1)
        self.sizer.Add(self.button2)
        panel.SetSizerAndFit(self.sizer)

class MyGame(wx.App):
    def OnInit(self):
        frame=FirstFrame(None,-1,"wx")
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app=MyGame()
app.MainLoop()

就个人而言,我不会使用Fit()SetSizerAndFit()因为这样的奇怪问题。

答案 1 :(得分:0)

如果你使用sizer,你不应该使用固定大小,让sizer完成它们的工作:)。

所以从按钮和文本控件中删除'size ='并将init中的最后一行更改为'panel.SetSizer(self.sizer),你的sizer控制你面板的子项,所以不要将它设置为框架。由于面板是框架中唯一可用的面板,否则你需要另一个框架的sizer。

我是size_controls的粉丝,所以在这里你如何使用它们,它们自动处理所有sizer的东西,但是如果你需要它们仍然可以控制你,查看wxPython演示和/或doc在:sized_controls doc

import wx
import wx.lib.sized_controls as sc

class FirstFrame(sc.SizedFrame):
    def __init__(self,parent,id,title):
        super(FirstFrame, self).__init__(parent, id, 'PIZZA')
        pane = self.GetContentsPane()
        self.button1 = wx.Button(pane,id=-1,label='Click Me!')
        self.textbox = wx.TextCtrl(pane,id=-1)
        self.button2 = wx.Button(pane,-1,'Click Me Too!')

class MyGame(wx.App):
    def OnInit(self):
        frame=FirstFrame(None,-1,"wx")
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app=MyGame()
app.MainLoop()

答案 2 :(得分:0)

我终于找到了答案: 显然,有时当类具有绘制背景或在框架上设置位置的命令时,有时会发生这种情况,而不使用sizer。 大约10周后,当整个项目完成后,它就自行解决了。