【问题标题】:Make TextCtrl Scale with Window使 TextCtrl 随窗口缩放
【发布时间】:2020-07-01 15:02:38
【问题描述】:

我刚刚进入 Python 3.6 的 wxpython 并且遇到了障碍。我只是不知道如何使元素/小部件随屏幕缩放!我知道你必须使用sizer,但仅此而已,我对编程还是很陌生,所以仅仅阅读文档并没有帮助。如果有人可以对一些有效的代码进行采样,我将非常感激,因为我可以通读它并找出我做错了什么。绘制出我想用窗口大小缩放的 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)

【问题讨论】:

  • 发布您到目前为止所做的事情,以便可以根据您的要求量身定制答案,并且可以解释您所犯的任何错误。
  • @RolfofSaxony 我已经添加了有问题的代码,希望对您有所帮助。
  • 该代码中的关键问题是,尽管没有使用 sizers,但您不必这样做,您可以根据需要调整小部件的大小和位置,您还没有声明任何大小或位置。结果是任何投入的小部件都是默认大小和默认位置。如果你有不止一件物品,它们都会相互重叠,因为没有定位说明。

标签: python python-3.x wxpython python-module


【解决方案1】:

首先,最好将 sizers 等同于熟悉的东西,我通常会想到储物盒或抽屉柜。
当我们定义小部件时,它们都被转储到一个容器中,即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()

【讨论】:

  • 完美,我仍然对这一切如何运作一无所知,但我设法实现了我所需要的。再次感谢。
  • @NucleaTNT 请记住,如果 sizers 目前对您来说有点多,您可以给每个小部件一个 size 和一个 pos(位置)。换句话说,您可以在面板/框架上指定其大小和位置。这有其缺点,但允许您使用实际编码来破解,提供一个工作 GUI,您可以稍后在有时间了解 sizers 时对其进行修改。
  • @NucleaTNT 请参阅我的编辑以获取代码的非大小调整版本。然而,这在某种程度上与您关于缩放的原始查询相悖。如果没有 sizers,它就不会缩放,因为它会有一个固定的大小。你必须重新计算它的大小,这是 sizers 自动为你做的事情,这就是为什么它们是 very 受欢迎的原因。
  • 知道了,我最终在“您确定要退出吗?”中使用了尺寸和位置。窗口代替。我只需要继续阅读文档和示例,直到它点击 sizer 的工作方式。再次感谢:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多