【问题标题】:wxPython ScrolledPanel not resizing in dialogwxPython ScrolledPanel 未在对话框中调整大小
【发布时间】:2015-11-18 22:00:06
【问题描述】:

首先,我使用的是 wxPython 2.8.12.1。

我正在尝试创建一个设置对话框,用户可以在其中查看然后编辑某些设置。 Atm 我在滚动面板中有设置,然后我希望将面板添加到我的对话框中,在对话框底部使用“保存”和“取消”按钮。我可以模糊地得到我需要的东西,但是滚动面板开始时非常小(一次甚至不显示一整行垂直的文本),并且它不会随对话框调整大小。这是我的代码的样子:

import wx
import wx.lib.scrolledpanel as scrolled

class SettingsDialog(wx.Dialog):    
    def __init__(self):
        """Initialize the dialog"""
        wx.Dialog.__init__(self, None, wx.ID_ANY, 'Settings', size=(100,100),
                           style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        # Add Settings Panel
        self.panel = SettingsPanel(self)
        self.mainSizer.Add(self.panel, 0, wx.EXPAND)
        # Add Save/Cancel Buttons
        self.createWidgets()
        # Set sizer and window size
        self.SetSizer(self.mainSizer)
        self.mainSizer.Fit(self)

    def createWidgets(self):
        """Create and layout the widgets in the dialog"""
        btnSizer = wx.StdDialogButtonSizer()

        saveBtn = wx.Button(self, wx.ID_OK, label="Save")
        saveBtn.Bind(wx.EVT_BUTTON, self.OnSave)
        btnSizer.AddButton(saveBtn)

        cancelBtn = wx.Button(self, wx.ID_CANCEL)
        btnSizer.AddButton(cancelBtn)
        btnSizer.Realize()

        self.mainSizer.Add(btnSizer, 0, wx.ALL | wx.ALIGN_RIGHT, 5)

    def OnSave(self, event):
        pass

class SettingsPanel(scrolled.ScrolledPanel):
    def __init__(self, parent):
        scrolled.ScrolledPanel.__init__(self, parent, -1)
        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.createWidgets()
        self.SetSizer(self.mainSizer)
        self.mainSizer.Fit(self)
        self.SetupScrolling()

    def createWidgets(self):
        """Create and layout the widgets in the panel"""
        settingsSizer = wx.GridSizer(rows=0, cols=2, hgap=5, vgap=0)

        names = #List of names grabbed from elsewhere
        values = #List of values grabbed from elsewhere
        name_value_dict = zip(names, values)

        for name, value in name_value_dict:
            lbl = wx.StaticText(self, label=''.join([name,':']))
            settingsSizer.Add(lbl, 0, wx.ALL, 5)
            txt = wx.TextCtrl(self, value=value, name="Name")
            settingsSizer.Add(txt, 0, wx.ALL|wx.EXPAND, 5)

        self.mainSizer.Add(settingsSizer, 0, wx.EXPAND)

class MyApp(wx.App):
    def OnInit(self):
        dlg = SettingsDialog()
        dlg.ShowModal()
        dlg.Destroy()
        return True

if __name__ == '__main__':   
    app = MyApp(False)
    app.MainLoop()

一如既往地感谢任何帮助。

【问题讨论】:

    标签: wxpython wxwidgets


    【解决方案1】:

    我使用 wxPython 3.0 版修复了您的代码,它看起来如您所愿。它也适用于 2.8 版。让我解释一下你应该怎么做。

    1. 增大对话框的大小。仅显示所有小部件是不够的。 wx.Dialog.__init__(self, None, wx.ID_ANY, 'Settings', size=(300, 300), ...
    2. 为您的ScrolledPanel 添加一个size 参数,就像这样scrolled.ScrolledPanel.__init__(self, parent, -1, size=(200, 200))

    就是这样。希望这会有所帮助。

    【讨论】:

    • 好的,谢谢。我还没有仔细看,但我并不太担心在初始化时设置大小。我希望 sizer.Fit(parent) 能解决这个问题。
    • 所以看起来设置大小是主要问题。如果设置更改大小,是否有一种简单的方法可以自动执行此操作?这甚至是一种好的做法,还是有一个看起来不错的默认尺寸更好?就我之前的情况而言,我希望面板适合包含所有小部件,然后对话框适合包含面板和按钮。
    • 有一些办法,本帖讨论一下stackoverflow.com/q/12607460/5303401
    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多