使用 Window 使 TextCtrl 缩放

Make TextCtrl Scale with Window

我刚刚进入 Python 3.6 的 wxpython,但遇到了障碍。我就是不知道如何 elements/widgets 随屏幕缩放!我知道你必须使用 sizer,但仅此而已,我对编程还是很陌生,所以仅仅阅读文档并没有帮助。如果有人可以对一些有效的代码进行采样,我将非常感激,因为我可以通读它并找出我做错了什么。绘制出我想用 window 大小缩放的 GUI 的代码如下,关键思想是 TextCtrl 缩放,其他元素并不需要缩放。

def createGUI(self):
        panel = wx.Panel(self)
        menuBar = wx.MenuBar()
        
        menuButton = wx.Menu()
        newItem = wx.MenuItem(menuButton, wx.ID_NEW, 'New Note\tCtrl+N')
        delItem = wx.MenuItem(menuButton, wx.ID_DELETE, 'Delete Note\tCtrl+Backspace')
        saveItem = wx.MenuItem(menuButton, wx.ID_SAVE, 'Save\tCtrl+S')
        exitItem = wx.MenuItem(menuButton, wx.ID_EXIT, 'Quit\tCtrl+Q')
        
        
        menuButton.Append(newItem)
        menuButton.Append(saveItem)
        menuButton.Append(delItem)
        menuButton.Append(exitItem)

        
        menuBar.Append(menuButton, 'Menu')
        self.SetMenuBar(menuBar)
        
        self.Bind(wx.EVT_MENU, self.new, newItem)
        self.Bind(wx.EVT_MENU, self.delete, delItem)
        self.Bind(wx.EVT_MENU, self.save, saveItem)
        self.Bind(wx.EVT_MENU, self.onExit, exitItem)
        
        self.noteText = wx.TextCtrl(panel)
        self.noteText.AppendText(self.notecontent)
        
        self.Bind(wx.EVT_CLOSE, self.onExit)
        self.SetTitle(f'Welcome {self.username}! You are working on {self.notepath}')
        self.Centre()
        self.Show(True)

首先,最好将 sizer 等同于熟悉的东西,我通常会想到储物盒或抽屉柜。
当我们定义小部件时,它们都被转储到一个容器中,即 parent 对象,通常是无处不在的 selfself.panel.
如果我们不为每个项目分配一个 sizepos,它只是一团糟,一堆小部件。
sizer,有很多种,就是我们抽屉柜里的虚拟抽屉,把这堆小东西整理得井井有条。
小部件被分配给适当的 sizer,note sizer 可以进入其他 sizer,最终当所有东西都被分配到一个位置或 drawer 在我们的抽屉柜中时,sizer 施展魔法,安排和将所有小部件调整到一个连贯的屏幕中以显示或排列抽屉内容和抽屉柜中的相对位置。
下面,我使用了最简单的 sizer boxsizer。
一个会竖排,一个会横排。
水平尺寸器用于按钮和垂直尺寸器,将是主要尺寸器,我不仅将 TectCtrl 放置在其中,还放置按钮,预先安排在它们的水平尺寸器中。
有关 sizer 及其控件的更好和更全面的描述,请参阅:https://docs.wxpython.org/sizers_overview.html 有关可用的实际 sizer 的详细信息,请参阅每个的详细文档。

您的代码的粗略近似值:

#!/usr/bin/python

import wx
class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title,
            size=(450, 350))

        self.panel = wx.Panel(self, -1)

        self.main_sizer = wx.BoxSizer(wx.VERTICAL)
        self.button_sizer = wx.BoxSizer(wx.HORIZONTAL)

        self.noteText = wx.TextCtrl(self.panel, -1, style=wx.TE_MULTILINE)
        self.Button_close = wx.Button(self.panel, -1, label="Quit")
        self.Button_1 = wx.Button(self.panel, -1, label="Btn1")
        self.Button_2 = wx.Button(self.panel, -1, label="Btn2")

        self.Bind(wx.EVT_CLOSE, self.onExit)
        self.Button_close.Bind(wx.EVT_BUTTON, self.onExit)
        self.Button_1.Bind(wx.EVT_BUTTON, self.onButton)
        self.Button_2.Bind(wx.EVT_BUTTON, self.onButton)


        # Place buttons within their own horizontal sizer
        self.button_sizer.Add(self.Button_close,proportion=0, flag=wx.ALL, border=10)
        self.button_sizer.Add(self.Button_1,proportion=0, flag=wx.ALL, border=10)
        self.button_sizer.Add(self.Button_2,proportion=0, flag=wx.ALL, border=10)

        # Add textctrl and the button sizer to the main sizer (vertical)
        self.main_sizer.Add(self.noteText,proportion=1, flag=wx.EXPAND|wx.ALL, border=10)
        self.main_sizer.Add(self.button_sizer, 0, 0, 0)
        self.panel.SetSizer(self.main_sizer)
        self.Show()

    def onExit(self, event):
        self.Destroy()

    def onButton(self, event):
        print("A button was pressed")

if __name__ == '__main__':
    app = wx.App()
    Example(None, title="Example")
    app.MainLoop()

编辑: 尽管推荐使用 sizer,但这是相同的代码。

#!/usr/bin/python

import wx
class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title,
            size=(450, 350))

        self.panel = wx.Panel(self, -1)

        self.noteText = wx.TextCtrl(self.panel, -1, pos=(10,10), size=(400,280), style=wx.TE_MULTILINE)
        self.Button_close = wx.Button(self.panel, -1, label="Quit", pos=(10,290), size=(50,30))
        self.Button_1 = wx.Button(self.panel, -1, label="Btn1", pos=(70,290), size=(50,30))
        self.Button_2 = wx.Button(self.panel, -1, label="Btn2", pos=(130,290), size=(50,30))

        self.Bind(wx.EVT_CLOSE, self.onExit)
        self.Button_close.Bind(wx.EVT_BUTTON, self.onExit)
        self.Button_1.Bind(wx.EVT_BUTTON, self.onButton)
        self.Button_2.Bind(wx.EVT_BUTTON, self.onButton)
        self.Show()

    def onExit(self, event):
        self.Destroy()

    def onButton(self, event):
        print("A button was pressed")

if __name__ == '__main__':
    app = wx.App()
    Example(None, title="Example")
    app.MainLoop()