我试着把一个面板分成两个面板。 所以按钮1应该在一个面板上,按钮2,3,4应该在另一个面板上。你知道吗
这是我的可运行代码,它不能正确显示面板。你知道吗
import wx
from numpy import arange, sin, pi
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
class Frame1(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, None,
pos=wx.Point(0, 0),size=wx.Size(800, 200),
style=wx.DEFAULT_FRAME_STYLE | wx.MAXIMIZE )
self.panel1 = wx.Panel(self)
self.panel2 = wx.Panel(self)
#self.panel1.SetBackgroundColour('blue')
self.panel3 = wx.Panel(self)
self.panel4 = wx.Panel(self)
self.panel3.SetBackgroundColour('red')
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(self.panel4, 1, wx.EXPAND)
sizer1.Add(self.panel1, 1, wx.EXPAND)
self.SetSizer(sizer1)
sizer1.Fit(self)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(sizer1, 1, wx.EXPAND)
sizer.Add(self.panel2, 1, wx.EXPAND)
sizer.Add(self.panel3, 1, wx.EXPAND)
self.SetSizer(sizer)
#sizer.Fit(self)
self.log = wx.TextCtrl(self.panel3, style=wx.TE_RICH|wx.TE_MULTILINE)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.log, 1, wx.EXPAND|wx.ALL, 15)
self.panel3.SetSizer(sizer)
emptycell = (0,0)
self.button1 = wx.Button(self.panel4, -1, "Button1", size=wx.Size(150, 70))
self.button2 = wx.Button(self.panel1, -1, "Button2")
self.button3 = wx.Button(self.panel1, -1, "Button3")
self.button4 = wx.Button(self.panel1, -1, "Button4")
sizer = wx.GridSizer(8,3,0,0)
sizer.Add(emptycell, 0, wx.EXPAND)
sizer.Add(self.button1, 0, wx.ALIGN_CENTER|wx.LEFT, 10)
sizer.Add(emptycell, 0, wx.EXPAND)
sizer.Add(self.button2, 0, wx.ALIGN_CENTER)
sizer.Add(self.button3, 0, wx.ALIGN_CENTER)
sizer.Add(self.button4, 0, wx.ALIGN_CENTER)
self.panel1.SetSizer(sizer)
self.figure = Figure()
self.axes = self.figure.add_subplot(111)
self.canvas = FigureCanvas(self.panel2, -1, self.figure)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.canvas, 0, wx.EXPAND)
self.panel2.SetSizer(sizer)
#self.panel2.Fit()
t = arange(0.0, 3.0, 0.01)
s = sin(2 * pi * t)
self.axes.plot(t, s)
#self.Center()
#Every wxWidgets application must have a class derived from wxApp
class MyApp(wx.App):
# wxWidgets calls this method to initialize the application
def OnInit(self):
# Create an instance of our customized Frame class
self.frame = Frame1(None)
self.SetTopWindow(self.frame)
self.frame.Show()
return True
if __name__ == '__main__':
application = MyApp(0)
application.MainLoop()
期望结果
实际结果
哦,有些panel和sizer变量名很难理解。你知道吗
在处理wx时,很好地跟踪哪些窗口(面板、按钮等)将位于其他窗口的内部,并注意如何声明每个窗口的父窗口,这可能会有所帮助。你知道吗
例如,如果您有一个面板(例如,
panel1
)包含多个元素,那么当您实例化这些元素时,请将它们的父级all设置为panel1
。例如,当您创建self.button1
时,将其父级作为panel1
(与其他按钮相同),因为您将所有按钮都安装在panel1
中。你知道吗这是因为wx会自然而然地把窗户放在父母的身上。当一个窗口有一个父元素是一个元素,但是一个sizer试图把它放在另一个元素中,事情就会变得很糟糕。很难准确理解,但我想这就是你的问题所在。你知道吗
另一个可以使代码(a)更易于阅读/遵循/调试,以及(b)更好地工作的方法是:不要害怕实例化多个sizer变量。更好的是,给他们的名字匹配的小组,他们正在组织!你知道吗
我发现将
__init__
函数分为三个部分很有帮助(这可能对您也很有用):(1)从“顶层”开始实例化您需要的所有窗口/对象,为它们分配正确的父窗口;(2)实例化所有大小器,每个包含其他元素的窗口一个大小器;(3)从“底层”开始level“向上,将窗口添加到它们的父窗口大小器中,在每个父面板上调用SetSizer
,一直工作到为顶级窗口设置主窗口大小器为止。你知道吗如果你不这样做,请随时给我发一条消息,我们会看看我们是否可以解析出为什么wx没有像它应该的那样工作。你知道吗
我不得不修改一下,但是试着给每个面板一个自己的尺寸,并在最后把它们放在一起。另外,使用描述性的名字,否则很快就会变成泥沼,很难理解。你知道吗
相关问题 更多 >
编程相关推荐