簡體   English   中英

對如何構建 GUI(wxpython)感到困惑

[英]Confused on how to structure the GUI (wxpython)

我從一本書到另一本書,從谷歌搜索到另一本書,我注意到每一本書都以完全不同的方式啟動主要的 window。

我不想養成壞習慣,所以有人可以給我最好的這些選擇,以及為什么它是更好的方法。 以下是我見過的所有方法

一個)
class iFrame(wx.Frame): def init (....): wx.Frame._ init _(...)

二)
class iFrame(wx.Frame):def init (...): super_init _ (...)

C)
然后我看到一些使用面板的替代品,例如
class iPanel(wx.Panel)定義初始化(...):wx.Panel。 初始化(...)

D)
更令人困惑的是,有些人正在使用 wx 的常規應用 class
class iApp(wx.App):def OnInit(self): wx.Frame。 初始化(...)

如果我的一些結構是錯誤的,請原諒我,但我在腦海中回憶起這些,再次提問......其中哪一個,如果有的話是構建 GUI 的最佳方式。 當它們都以不同的方式做事時,很難遵循教程和書籍

編輯:對不起,如果格式不正確,但通常它可以工作......

別擔心。 你不會因為現在做出錯誤的選擇而毀掉你未來的編程。

您提到的所有選項都沒有錯。 他們都做不同的事情,因為不同的應用程序有不同的要求。 沒有一種方法是最好的。

只做你想做的事情,做適合你的事情,一旦你更加熟悉,你就會明白為什么不同的代碼會有不同的表現。

我最喜歡的開始 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()

另請參閱這個問題,這是相關的。

我經歷了一個艱難的過程,就像在每個應用程序中一樣,封裝很重要。 而 wxPython 特有的主框架 object 應該只有一個面板小部件,以及可選的菜單欄、工具欄和狀態欄小部件。 沒有其他的。

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

為了回應 XilyummY 的評論,我添加了這個額外的答案,以展示如何將主要類組織在單獨的文件中。

這是我基於四個文件的解決方案:

  1. main.py:應用程序和應用程序加載器的主框架;
  2. main_panel.py:應用程序的主面板;
  3. menu_bar.py:框架的菜單欄定義;
  4. tool_bar.py:來自框架的工具欄。

代碼按以下順序排列:

主文件

import wx

from main_panel import MainPanel
from menu_bar import MenuBar
from tool_bar import MainToolbar


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

主面板.py

import wx


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)

菜單欄.py

import wx


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)

工具欄.py

import wx


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

        new_bmp =  wx.ArtProvider.GetBitmap(wx.ART_NEW)
        #preferences_bmp = wx.Bitmap('images/preferences.png')
        quit_bmp =  wx.ArtProvider.GetBitmap(wx.ART_QUIT)

        self.AddTool(wx.ID_NEW, 'New', new_bmp)
        #self.AddTool(wx.ID_PREFERENCES, 'Preferences', preferences_bmp)
        self.AddTool(wx.ID_EXIT, 'Quit', quit_bmp)

        self.SetToolShortHelp(wx.ID_NEW, 'New ...')
        self.SetToolShortHelp(wx.ID_PREFERENCES, 'Preferences ...')
        self.SetToolShortHelp(wx.ID_EXIT, 'Quit')

        self.Bind(wx.EVT_TOOL, parent.on_quit_click, id=wx.ID_EXIT)

        self.Realize()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM