使用wxPython将现有布局替换为新布局 [英] Replace an Existing layout with new layout with wxPython
问题描述
我是wxPython的新手.我正在使用Gridbagsizer进行布局. 我几乎成功地完成了所需的布局.但是对于一些未知的问题,它却带来了一些问题.
I am new to wxPython. I am making a layout with Gridbagsizer. I almost succeeded in making my desired layout. But for some unknown problem it is giving some problem.
我的目标: 我做了5个布局.绿色,红色,蓝色,黄色和黑色.当我双击"This is test run"时,应该将黄色布局完全替换为黑色布局.
My objective: I made 5 layouts. Green, Red, Blue, Yellow and Black. When I double-click on "This is test run", the yellow layout is supposed to be replaced by black layout completely.
实际发生的情况: 黄色被黑色代替.没问题的.但是蓝色布局的位置由于某种原因而移到了底部.
What actually happens: Yellow gets replaced by black. No problem on that. But blue layouts position gets shifted to bottom for some reason.
我的代码如下:
import wx
class myframe(wx.Frame):
def __init__(self):
"Constructor. No arguments"
wx.Frame.__init__(self, None, size=(1000,700))
self.TitlePanel = wx.Panel( self, size=(350, 400) )
self.newPanel = wx.Panel( self, size=(300, 250) )
imgPanel = wx.Panel( self, size=(300, 250) )
modulePanel=wx.Panel( self, size=(350, 250) )
self.TCPanel=wx.Panel( self, size=(300, 250) )
############################################
self.TitlePanel.SetBackgroundColour("green")
imgPanel.SetBackgroundColour("red")
modulePanel.SetBackgroundColour("blue")
self.TCPanel.SetBackgroundColour("yellow")
self.newPanel.SetBackgroundColour("black")
self.newPanel.Hide()
############################################
self.myGridSizer = wx.GridBagSizer(1,1)
self.myGridSizer.Add(self.TitlePanel, pos=(0, 0), span=(4,8), flag=wx.EXPAND)
self.myGridSizer.Add(imgPanel, pos=(0, 10), span=(4,8), flag=wx.ALL)
self.myGridSizer.Add(modulePanel, pos=(10, 0), span=(1,8), flag=wx.ALL)
self.myGridSizer.Add(self.TCPanel, pos=(10, 10), span=(4,8), flag=wx.ALL)
#############################################
self.text1 = wx.StaticText(self.TitlePanel, label="This is a test run",style=2,size=(350,-1))
font = wx.Font(18, wx.DECORATIVE, wx.ITALIC,wx.BOLD, wx.NORMAL)
self.text1.SetFont(font)
#############################################
self.SetSizer(self.myGridSizer)
self.text1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe)
imgPanel.Bind(wx.EVT_LEFT_DCLICK, self.showMe)
self.myGridSizer.SetEmptyCellSize((0, 0))
def hideMe(self, event):
self.TCPanel.Hide()
self.myGridSizer.Add(self.newPanel, pos=(5, 10), span=(4,8), flag=wx.ALL)
self.newPanel.Show()
self.Layout()
def showMe(self, event):
print "show!"
self.newPanel.Hide()
self.TCPanel.Show()
self.Layout()
if __name__ == "__main__":
app = wx.App()
region = myframe()
region.Show()
app.MainLoop()
那么,如何替换布局并保持现有布局不变?
推荐答案
首先,您应该更正text1
位置的控制方式.如果它是TitlePanel
的子级,则应该对TitlePanel
使用新的大小调整器,并将text1
放入其中.您的大小调整器应遵循父子层次结构.
First you should correct how your text1
is being controlled with respect to it's position. If it is a child of TitlePanel
, then you should use a new sizer for TitlePanel
and put text1
inside. Your sizers should follow the parent-child hierarchy.
接下来,仅Hide()
和Show()
是不够的,您必须正确替换sizer中的元素.最简单的方法是使用sizer.Replace(old_widget, new_widget)
.
Next, it is not enough to just Hide()
and Show()
, you have to replace the element in sizer correctly. Easiest way is to use sizer.Replace(old_widget, new_widget)
.
import wx
class myframe(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, size=(1000,700))
self.TitlePanel = wx.Panel(self, size=(350, 400))
self.TitlePanel.SetBackgroundColour("green")
self.newPanel = wx.Panel(self, size=(300, 250))
self.newPanel.SetBackgroundColour("black")
self.newPanel.Hide()
self.imgPanel = wx.Panel(self, size=(300, 250))
self.imgPanel.SetBackgroundColour("red")
self.modulePanel=wx.Panel(self, size=(350, 250))
self.modulePanel.SetBackgroundColour("blue")
self.TCPanel=wx.Panel(self, size=(300, 250))
self.TCPanel.SetBackgroundColour("yellow")
self.myGridSizer = wx.GridBagSizer(1,1)
self.myGridSizer.SetEmptyCellSize((0, 0))
self.myGridSizer.Add(self.TitlePanel, pos=(0, 0), span=(4,8), flag=wx.EXPAND)
self.myGridSizer.Add(self.imgPanel, pos=(0, 10), span=(4,8), flag=wx.ALL)
self.myGridSizer.Add(self.modulePanel, pos=(10, 0), span=(1,8), flag=wx.ALL)
self.myGridSizer.Add(self.TCPanel, pos=(10, 10), span=(4,8), flag=wx.ALL)
self.text1 = wx.StaticText(self.TitlePanel, label="This is a test run",style=2,size=(350,-1))
font = wx.Font(18, wx.DECORATIVE, wx.ITALIC,wx.BOLD, wx.NORMAL)
self.text1.SetFont(font)
self.titleSizer = wx.BoxSizer()
self.titleSizer.Add(self.text1, flag=wx.TOP|wx.LEFT|wx.ALIGN_RIGHT,border=10)
self.TitlePanel.SetSizer(self.titleSizer)
self.SetSizer(self.myGridSizer)
self.text1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe)
self.imgPanel.Bind(wx.EVT_LEFT_DCLICK, self.showMe)
def hideMe(self, event):
self.TCPanel.Hide()
self.myGridSizer.Replace(self.TCPanel, self.newPanel)
self.newPanel.Show()
self.Layout()
def showMe(self, event):
self.newPanel.Hide()
self.myGridSizer.Replace(self.newPanel, self.TCPanel)
self.TCPanel.Show()
self.Layout()
if __name__ == "__main__":
app = wx.App()
region = myframe()
region.Show()
app.MainLoop()
关于您的代码的一些注意事项:
Also a few notes regarding your code:
- 请勿在方括号中加空格.这是丑陋的,违背了一般的Python风格.
- 请勿将局部变量与窗口小部件的对象属性混合.使用一种方法并坚持下去,最好使用对象属性.这样,您将可以使用所有方法访问窗口小部件.
- 通常通过属性设置等对创建小部件进行分组更具可读性.真的很难在代码中找到哪个面板是哪种颜色.
这篇关于使用wxPython将现有布局替换为新布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!