对如何构造GUI感到困惑(wxpython)

2024-09-25 08:31:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一本书到另一本书,从一个谷歌搜索到另一个,我注意到每一本都以完全不同的方式启动主窗口。在

我不想养成坏习惯,所以有人可以给我最好的选择,为什么是更好的方法。下面是我看到的所有方法

A)
类iFrame(wx.框架): definit(…..): wx.框架.\uinit\u(…)

B)
类iFrame(wx.框架): definit(…): 超级init(…)

C)
然后我看到一些使用面板的,比如
iPanel类(wx.面板) definit(…): wx.面板.init(…)

D)
更令人困惑的是,有些人使用wx的常规应用程序类
iApp级(wx.应用程序): def OnInit(自我): wx.框架.init(…)

如果我的一些结构是错误的,请原谅我,但是我正在从头开始回忆这些,再问一次……其中哪一个(如果有的话)是构建GUI的最佳方式。当教程和书籍都以不同的方式做事时,很难遵循它们

编辑:很抱歉,如果格式不正确,但它正常工作。。。在


Tags: 方法框架应用程序面板initdef方式常规
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()

另请参阅这个question,这是相关的。在

别担心。你不会因为现在做了错误的选择而毁掉你未来的编程。在

你提到的选项没有一个是错的。因为不同的应用程序有不同的需求,所以它们做的事情都不同。没有一种方法是最好的。在

只要做你想做的事情,做对你有用的事情,一旦你更加熟悉,你就会明白为什么不同的代码会有不同的表现。在

我很难理解,在每个应用程序中,封装都很重要。任选的小工具条,加上一个特殊的窗口小部件,在主菜单栏上加上一个特殊的窗口小部件。没别的了。在

这是我的新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()

相关问题 更多 >