【问题标题】:Wxpython clear widgets and create new layoutWxpython 清除小部件并创建新布局
【发布时间】:2018-12-12 05:55:04
【问题描述】:

我正在尝试使用 Wxpyhon 制作一个简单的游戏。第一个布局是“欢迎!”布局,用户单击“让我们开始吧!-->”小部件按钮继续。我希望第二个布局让用户输入他们的姓名。

如何将第一个布局更改为第二个布局(重置为新的布局)?我是破坏框架还是破坏面板?我希望两个布局都在同一个窗口上,具有相同的大小、相同的确切位置等。如果我要破坏框架,我是否必须重新设置并再次输入大小、位置等? 有什么方法可以在不使用 Hide() 小部件、WizardPage 或 AddPage 的情况下做到这一点?

我考虑过创建一个类或函数,每次前一个框架或面板被销毁时专门创建一个新的框架或面板,这样我就不必再次输入尺寸和位置的麻烦,但我没有认为这个想法会奏效。

我对 Wxpython 和 Python 非常陌生,因为我差不多一个月前才开始使用 Python,而且我刚刚学习了大约一周的 WxPython。我搜索了教程来帮助我解决这个问题,但我仍然对在我的代码中放入什么感到困惑。

提前致谢。

【问题讨论】:

  • 欢迎来到 SO,请创建一个最小、完整和可验证的示例。 stackoverflow.com/help/mcve
  • @Jaine,您是否有理由要使用相同的对话框/面板?拥有 wxWizard 或为此使用 2 个不同的对话框要简单得多。你只是想太多设计了。

标签: wxpython wxwidgets


【解决方案1】:

你可能不需要破坏任何东西。您可以根据需要隐藏和显示面板。我有一个在我的blog 上切换面板的示例。代码如下:

import wx
import wx.grid as gridlib


class PanelOne(wx.Panel):
    """"""

    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent=parent)
        txt = wx.TextCtrl(self)


class PanelTwo(wx.Panel):
    """"""

    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent=parent)

        grid = gridlib.Grid(self)
        grid.CreateGrid(25,12)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(grid, 0, wx.EXPAND)
        self.SetSizer(sizer)


class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "Panel Switcher Tutorial")

        self.panel_one = PanelOne(self)
        self.panel_two = PanelTwo(self)
        self.panel_two.Hide()

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.panel_one, 1, wx.EXPAND)
        self.sizer.Add(self.panel_two, 1, wx.EXPAND)
        self.SetSizer(self.sizer)


        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        switch_panels_menu_item = fileMenu.Append(wx.ID_ANY, 
                                                  "Switch Panels", 
                                                  "Some text")
        self.Bind(wx.EVT_MENU, self.onSwitchPanels, 
                  switch_panels_menu_item)
        menubar.Append(fileMenu, '&File')
        self.SetMenuBar(menubar)

    def onSwitchPanels(self, event):
        """"""
        if self.panel_one.IsShown():
            self.SetTitle("Panel Two Showing")
            self.panel_one.Hide()
            self.panel_two.Show()
        else:
            self.SetTitle("Panel One Showing")
            self.panel_one.Show()
            self.panel_two.Hide()
        self.Layout()


# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

您可以对您的应用程序做同样的事情。

【讨论】:

  • 他写道:but I don't think this idea will work。我很想知道为什么?这正是我提出上述问题的原因。
  • 是的,除非 OP 明确他们想要什么,否则很难说
猜你喜欢
  • 2012-06-03
  • 2011-05-30
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 2012-04-11
  • 2014-09-05
相关资源
最近更新 更多