gpt4 book ai didi

python - 使用 wxPython 将现有布局替换为新布局

转载 作者:行者123 更新时间:2023-12-04 19:20:42 27 4
gpt4 key购买 nike

我是 wxPython 的新手。我正在使用 Gridbagsizer 进行布局。
我几乎成功地做出了我想要的布局。但是对于一些未知的问题,它给出了一些问题。

我的目标:
我做了5个布局。绿色,红色,蓝色,黄色和黑色。当我双击“这是试运行”时,黄色布局应该完全被黑色布局取代。

实际发生的情况:
黄色被黑色取代。没问题。但是由于某种原因,蓝色布局位置移到了底部。

我的代码是这样的:

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()

So, How can I replace a layout and keep existing layouts intact?

最佳答案

首先你应该更正你的text1正在对其位置进行控制。如果是 TitlePanel 的 child ,那么您应该为TitlePanel 使用新的sizer并把 text1里面。您的 sizer 应该遵循父子层次结构。

接下来,仅仅 Hide() 是不够的和 Show() ,您必须正确替换sizer中的元素。最简单的方法是使用 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()

还有一些关于您的代码的注意事项:
  • 不要用空格包围括号。它是丑陋的,不符合一般的 Python 风格。
  • 不要将局部变量与小部件的对象属性混合。使用一种方式并坚持下去,最好使用对象属性。这样,您将可以通过所有方法访问您的小部件。
  • 使用属性设置等对小部件创建进行分组通常更具可读性。在代码中很难找到哪个面板是哪种颜色。
  • 关于python - 使用 wxPython 将现有布局替换为新布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20676849/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com