簡體   English   中英

使用 Window 使 TextCtrl 縮放

[英]Make TextCtrl Scale with Window

我剛剛進入 wxpython 的 Python 3.6 並且遇到了障礙。 我只是不知道如何使元素/小部件隨屏幕縮放,我知道你必須使用尺寸器,但僅此而已。 我對編程還是很陌生,所以僅僅閱讀文檔並沒有幫助。 如果有人可以對一些有效的代碼進行采樣,我將非常感激,因為我可以通讀它並找出我做錯了什么,繪制出我想用 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)

首先,最好將 sizers 等同於熟悉的東西,我通常會想到儲物盒或抽屜櫃。
當我們定義小部件時,它們都被轉儲到一個容器中,即parent object,通常是無處不在的selfself.panel
如果我們不給每個項目分配一個sizepos ,那它只是一團亂麻,一堆小部件。
sizer有很多類型,是我們抽屜櫃中的虛擬抽屜,它將這堆小部件按順序排列。
小部件被分配給適當的尺寸器,注意尺寸器可以sizer到其他尺寸器中,最終當所有東西都被分配到我們的抽屜櫃中的位置或drawer時,尺寸器會發揮它們的魔力,將所有小部件排列和調整大小到一個連貫的屏幕中用於展示或排列抽屜內容和在抽屜櫃中的相對位置。
下面,我使用了最簡單的sizer a 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,但這是相同的代碼,但不使用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()

暫無
暫無

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

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