不知如何构建GUI(wxpython)

3 投票
4 回答
2234 浏览
提问于 2025-04-16 18:21

我看了很多书和谷歌搜索,发现每一本书和每个搜索结果都用完全不同的方式来启动主窗口。

我不想养成坏习惯,所以能不能请大家给我推荐一个最好的方法,并解释一下为什么这个方法更好。下面是我见过的几种方式:

A)
class iFrame(wx.Frame):
    def init(....):
        wx.Frame._init_(...)

B)
class iFrame(wx.Frame):
    def init(...):
        super_init_(...)

C)
还有一些使用面板的方式,比如
class iPanel(wx.Panel)
    def init(...):
        wx.Panel.init(...)

D)
还有更让人困惑的,有些人使用wx的普通应用类
class iApp(wx.App):
    def OnInit(self):

        wx.Frame.init(...)

如果我有些结构写错了,请原谅,我是凭记忆回忆的。再问一次……这些方法中,哪一个是构建图形界面的最佳方式?当所有教程和书籍都用不同的方法时,真的很难跟上。

编辑:抱歉格式不太对,但通常是可以工作的……

4 个回答

2

我通过实践学到了一个重要的道理:在每个应用程序中,封装是非常重要的。对于wxPython来说,主框架对象应该只有一个面板小部件,另外可以有可选的菜单栏、工具栏和状态栏小部件。就是这些,不需要其他的。

这是我创建新的wxPython应用程序时的基本模式:

(更新于2019年2月7日:Wx Phoenix和Python 3)

import wx


class MainFrame(wx.Frame):
    """Create MainFrame class."""
    def __init__(self, *args, **kwargs):
        super(MainFrame, self).__init__(None, *args, **kwargs)
        self.Title = 'Basic wxPython module'
        self.SetMenuBar(MenuBar(self))
        self.ToolBar = MainToolbar(self)
        self.status_bar = StatusBar(self).status_bar
        self.Bind(wx.EVT_CLOSE, self.on_quit_click)
        panel = MainPanel(self)
        sizer = wx.BoxSizer()
        sizer.Add(panel)
        self.SetSizerAndFit(sizer)
        self.Centre()
        self.Show()

    def on_quit_click(self, event):
        """Handle close event."""
        del event
        wx.CallAfter(self.Destroy)


class MainPanel(wx.Panel):
    """Panel class to contain frame widgets."""
    def __init__(self, parent, *args, **kwargs):
        super(MainPanel, self).__init__(parent, *args, **kwargs)

        """Create and populate main sizer."""
        sizer = wx.BoxSizer(wx.VERTICAL)
        cmd_quit = wx.Button(self, id=wx.ID_EXIT)
        cmd_quit.Bind(wx.EVT_BUTTON, parent.on_quit_click)
        sizer.Add(cmd_quit)
        self.SetSizer(sizer)


class MenuBar(wx.MenuBar):
    """Create the menu bar."""
    def __init__(self, parent, *args, **kwargs):
        super(MenuBar, self).__init__(*args, **kwargs)
        # File menu
        file_menu = wx.Menu()
        self.Append(file_menu, '&File')

        quit_menu_item = wx.MenuItem(file_menu, wx.ID_EXIT)
        parent.Bind(wx.EVT_MENU, parent.on_quit_click, id=wx.ID_EXIT)

        file_menu.Append(quit_menu_item)


class MainToolbar(wx.ToolBar):
    """Create tool bar."""
    def __init__(self, parent, *args, **kwargs):
        super(MainToolbar, self).__init__(parent, *args, **kwargs)

        #quit_bmp =  wx.ArtProvider.GetBitmap(wx.ART_QUIT)
        #self.AddTool(wx.ID_EXIT, 'Quit', wx.Bitmap(quit_bmp))
        #self.SetToolShortHelp(wx.ID_EXIT, 'Quit')
        #self.Bind(wx.EVT_TOOL, parent.on_quit_click, id=wx.ID_EXIT)
        #self.Realize()


class StatusBar(object):
    def __init__(self, parent):
        """Create status bar."""
        self.status_bar = parent.CreateStatusBar()


if __name__ == '__main__':
    """Run the application."""
    screen_app = wx.App()
    main_frame = MainFrame()
    screen_app.MainLoop()
3

别担心。现在做错选择不会影响你未来的编程生涯。

你提到的这些选项都没有错。它们各自的做法不同,是因为不同的应用程序有不同的需求。没有一种方法是最好的。

只要专注于你想做的事情,找到适合你的方法。等你对编程更熟悉了,就会明白为什么不同的代码会有不同的写法。

3

我最喜欢的开始wx应用开发的方法是:

import wx

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.panel = wx.Panel(self)
        self.button = wx.Button(self.panel, label="Test")

        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.button)

        self.panel.SetSizerAndFit(self.sizer)  
        self.Show()

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

另外,可以看看这个问题,它也和这个话题有关。

撰写回答