【问题标题】:wxpython app goes off screen on lower resolutionswxpython 应用程序在较低分辨率下关闭屏幕
【发布时间】:2016-04-13 15:42:47
【问题描述】:

晚上好/早上好,

我一直在我的 1920x1080 显示器上开发一个相当深入的程序。我已将所有内容设置为最大化时适合我的显示器。我有一些我认为与我设置我的尺寸器的方式有关的问题。

首先,当我减小屏幕的实际尺寸时,窗口内容不会随之减小,而是从右侧切掉。因此,较小的屏幕意味着一半的内容,而不是一半的内容大小。

当我调整分辨率时,这个问题也会延续。使用较低的分辨率,我只能获得大约一半的实际适合我的屏幕的内容。我不知道我应该如何设置我的 sizer 来解决这个问题,所以这里简要描述一下我现在拥有它们的方式:

import wx

class simpleapp_wx(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,id,title,(-1,-1))
        self.parent = parent
        self.initialize()

    """ Create All of the pieces for the GUI """
    def initialize(self):
        sizer = wx.GridBagSizer()
        panel = wx.Panel(self)

        # Handles the creation of all of the buttons
        def make_button(text, starty, startx, height, width):
            button = wx.Button(self, -1, text)
            sizer.Add(button, (starty, startx), (height, width), wx.EXPAND)
            return button

        # Handles the c reation of all of the static text labels
        def make_label(text, starty, startx, height, width):
            self.label = wx.StaticText(self, -1, text, wx.DefaultPosition, wx.DefaultSize)
            sizer.Add(self.label, (starty, startx), (height, width), wx.EXPAND)
            return self.label

        # Create all of the labels for each slot and buttons
        for i in range(0, 4):
            # all the labels
            make_label('Voltage', 7, i*5, 1, 1)
            make_label('Current', 8, i*5, 1, 1)
            make_label('Power', 9, i*5, 1, 1)
            make_label('Rail 1', 6, (i*5)+1, 1, 1)
            make_label('Rail 2', 6, (i*5)+2, 1, 1)
            make_label('Rail 3', 6, (i*5)+3, 1, 1)
            make_label('Total Power', 6, (i*5)+4, 1, 1)
            make_label('Status:', 14, (i*5), 1, 1)
            # Global Rail commands for all 4 slots
            make_button("Margin Low", 1, (i*5)+2, 1, 1)
            make_button("Margin High", 1, (i*5)+3, 1, 1)
            make_button("Margin Off", 1, (i*5)+4, 1, 1)
            # Rail 1 for all 4 slots
            make_button("Margin High", 11, (i*5)+1, 1, 1)
            make_button("Margin Low", 12, (i*5)+1, 1, 1)
            make_button("Margin Off",  13, (i*5)+1, 1, 1)
            # Rail 2 for all 4 slots
            make_button("Margin High",  11, (i*5)+2, 1, 1)
            make_button("Margin Low", 12, (i*5)+2, 1, 1)
            make_button("Margin Off", 13, (i*5)+2, 1, 1)
            # Rail 3 for all 4 slots
            make_button("Margin High",  11, (i*5)+3, 1, 1)
            make_button("Margin Low",  12, (i*5)+3, 1, 1)
            make_button("Margin Off",  13, (i*5)+3, 1, 1)
            # Create the Configure buttons for each slot (only needs to run three times so needs if statement
            if i < 3:
                # Make the Configure buttons for Slot 1
                make_button("Configure",  10, i+1, 1 ,1)
                # Make the Configure buttons for Slot 2
                make_button("Configure",  10, i+6, 1, 1)
                # Make the Configure buttons for Slot 3
                make_button("Configure",  10, i+11, 1, 1)
                # Make the Configure buttons for Slot 4
                make_button("Configure",  10, i+16, 1, 1)

        self.SetSizerAndFit(sizer)
        self.SetSizeHints(-1,-1)
        self.Show(True)
        self.Maximize(True)

if __name__ == "__main__":
    app = wx.App()
    frame = simpleapp_wx(None,-1,'Add-in Card GUI')
    app.MainLoop()

我一直在阅读,我在某处读到了关于将 gridbagsizer 放在面板中的内容,这应该可以工作,所以我修改后的标题和更接近的是:

    sizer = wx.GridBagSizer()
    panel = wx.Panel(self)

    panel.SetSizer(sizer)
    panel.Fit()
    self.Fit()
    self.Show(True)
    self.Maximize(True)

这也没有改变任何东西。我尝试将 SetSizeHints 设置为特定的分辨率,但这也不起作用。

那么,是什么导致了这个问题?我觉得这与我只对所有内容使用一个尺寸器有关。如果是这种情况,对我来说,无需完全重建新的 sizer 和分解内容的最简单方法是什么?

【问题讨论】:

  • 您能否创建一个可运行的小型示例来演示该问题?
  • 我发布了一个小的工作示例。抱歉,缩进了,我一生都无法做到这一点。它实际上在堆栈上看起来是正确的,但是由于某种原因,当我将它复制到 gedit 时,它搞砸了,所以请注意这一点。该示例在上面的第一个文本框中,并替换了我的旧文本框。
  • 我不确定你希望它在更小的空间中表现如何,但你可以使用scrolledpanelpanel = wx.lib.scrolledpanel.ScrolledPanel(self) panel.SetupScrolling()
  • 我同意@SelçukCihan。我会为此使用ScrolledPanel。有这么多小部件,我不确定它是否可以调整它们的大小以使其可用。

标签: user-interface wxpython resolution maximize sizer


【解决方案1】:

您需要将sizer的列和行标记为可增长:

...
for i in range(0, 20):
    sizer.AddGrowableCol(i, 1)
for i in range(0, 15):
    sizer.AddGrowableRow(i, 1)

self.SetSizerAndFit(sizer)
...

适用于您的示例。现在,它仍然不会缩小很多,因为你有很多小部件,而且它们都有最小尺寸,但它至少会更紧一点。 (如果可用,可以展开以占用更多空间。)

至少对于 wxPython>=3,您需要确保仅尝试使存在的行或列可增长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多