wxPython - 框架没有按照编程打开
wxPython - the frame isn't opening as it's programmed
当我运行下面的程序时,我得到的只是一点点window,和一个小的文本框(text box),按照程序,应该是一个大的window,更大的文本框和两个按钮。
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()
您可能想要将 __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()
因为像这样的奇怪问题。
如果您使用 sizer,则不应使用固定大小,让 sizer 完成它们的工作:)。
所以从按钮和文本控件中删除 'size=' 并将你的 init 中的最后一行更改为 'panel.SetSizer(self.sizer),你的 sizer 控制的东西是你的面板,所以不要将它设置为框架。由于面板是框架中唯一可用的东西,否则您将需要另一个框架的 sizer。
我是 sized_controls 的粉丝,所以在这里你将如何使用它们,它们自动处理所有 sizer 的东西,但如果你需要它们仍然给你控制权,请查看 wxPython演示 and/or 文档位于: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()
我终于找到了答案:
显然,当 class 具有绘制背景或在框架上设置位置的命令时,有时会发生这种情况,而无需使用 sizer。
大约 10 周后,当整个项目完成时,它自己整理好了。
当我运行下面的程序时,我得到的只是一点点window,和一个小的文本框(text box),按照程序,应该是一个大的window,更大的文本框和两个按钮。
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()
您可能想要将 __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()
因为像这样的奇怪问题。
如果您使用 sizer,则不应使用固定大小,让 sizer 完成它们的工作:)。
所以从按钮和文本控件中删除 'size=' 并将你的 init 中的最后一行更改为 'panel.SetSizer(self.sizer),你的 sizer 控制的东西是你的面板,所以不要将它设置为框架。由于面板是框架中唯一可用的东西,否则您将需要另一个框架的 sizer。
我是 sized_controls 的粉丝,所以在这里你将如何使用它们,它们自动处理所有 sizer 的东西,但如果你需要它们仍然给你控制权,请查看 wxPython演示 and/or 文档位于: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()
我终于找到了答案: 显然,当 class 具有绘制背景或在框架上设置位置的命令时,有时会发生这种情况,而无需使用 sizer。 大约 10 周后,当整个项目完成时,它自己整理好了。