首页 > 解决方案 > 带有 wxPython 的基于 OOP 的 GUI

问题描述

首先,感谢大家。在过去的几个月里,我参考了可以在这些板上找到的所有帮助和指导,这有助于我更好地“掌握”python!

我还在学习……请简单的单词!

现在,回到问题所在!

我想开发一个相当“OOP 繁重”的 GUI,从某种意义上说,对象将被创建,继承自类继承的类(通过组合而不是多重继承;))

我现在遇到了一个障碍 - 如果我概述我的步骤可能会更清楚:

  1. 创建一个“主框架”</li>
  2. 向此框架添加拆分器窗口
  3. 在拆分器的左侧添加一个 treectrl

现在,这就是问题开始的地方......

我想创建一个对象(带有自己的面板,其中包含一个笔记本,其中包含与对象实例有关的各种信息。

这个对象的每个实例,当从 treectrl 的相应树项中选择时,应该填充拆分器的右侧,每次都有不同的实例笔记本。

这就是问题!

我已经尝试显示/隐藏 object.panel 引用,还尝试使用 splitterwindow 替换窗口功能 - 无济于事。

我尝试过的一些东西确实取代了右侧面板,但也显示了原始面板小部件......?

如果有人可以提供帮助,将不胜感激。

非常感谢。

标签: pythonoopwxpython

解决方案


谢谢你的建议。

当我阅读您关于 treectrl 事件的回复时 - 我想我会很快尝试 ReplaceWindow(oldpanel, newpanel),然后隐藏旧的,然后显示新的。

这成功了!wxPython 文档未能说明的是,在调用 replacewindow 方法后隐藏并显示相应的旧面板和新面板是正确实现更改所必需的。这可能是因为新旧面板的父母都是splitterwindow?

无论如何,以下代码可能会帮助其他可能偶然发现此问题/帖子的人,并展示我试图实现的概念。

谢谢你的帮助!

亚历克斯

import wx

class MyApp(wx.App):

def __init__(self):



    wx.App.__init__(self, redirect=False, filename='test')

    self.f1 = wx.Frame(parent=None, id=-1, title='APP', pos = (100, 100), size=(1000, 700))
    self.split = wx.SplitterWindow(self.f1)     

    self.leftPanel = wx.Panel(parent=self.split)
    self.oldPanel = wx.Panel(parent=self.split)
    self.newPanel = wx.Panel(parent=self.split)     

    self.oldLabel = wx.StaticText(parent=self.oldPanel, label='This is the old panel...', pos=(50, 50))
    self.newLabel = wx.StaticText(parent=self.newPanel, label='This is now the new panel!', pos=(50, 50))




    self.oldBut = wx.Button(parent = self.leftPanel,label='Show Old Panel', pos=(50, 50))
    self.newBut = wx.Button(parent = self.leftPanel, label='Show New Panel', pos=(50, 75))


    self.leftPanel.Bind(wx.EVT_BUTTON, self.showOld, self.oldBut)               
    self.leftPanel.Bind(wx.EVT_BUTTON, self.showNew, self.newBut)


    self.split.SplitVertically(self.leftPanel, self.oldPanel)
    self.split.SetMinimumPaneSize(100)
    self.split.SetSashPosition(300)

    self.f1.Show()
    self.SetTopWindow(self.f1)


def showOld(self, event):
    self.split.ReplaceWindow(self.split.GetWindow2(), self.oldPanel)
    self.newPanel.Hide()
    self.oldPanel.Show()


def showNew(self, event):
    self.split.ReplaceWindow(self.split.GetWindow2(), self.newPanel)    
    self.oldPanel.Hide()
    self.newPanel.Show()


if __name__ == '__main__':  
    app = MyApp()
    app.MainLoop()

推荐阅读