wxPython ScrolledPanel 不在对话框中调整大小
wxPython ScrolledPanel not resizing in dialog
首先,我使用的是 wxPython 2.8.12.1。
我正在尝试创建一个设置对话框,用户可以在其中查看然后编辑某些设置。 Atm 我在滚动面板中进行了设置,然后我希望将面板添加到我的对话框中,对话框底部有 "Save" 和 "Cancel" 按钮。我可以模糊地得到我需要的东西,但滚动面板开始时非常小(一次甚至不显示一整行垂直文本),并且不会随对话框调整大小。这是我的代码的样子:
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 3.0 版修复了你的代码,它看起来和你想要的一样。它也适用于 2.8 版。让我解释一下你应该做什么。
- 增大对话框的大小。显示所有小部件是不够的。
wx.Dialog.__init__(self, None, wx.ID_ANY, 'Settings', size=(300, 300), ...
- 像这样
scrolled.ScrolledPanel.__init__(self, parent, -1, size=(200, 200))
为你的 ScrolledPanel
添加一个 size
参数
就是这样。希望这有帮助。
首先,我使用的是 wxPython 2.8.12.1。
我正在尝试创建一个设置对话框,用户可以在其中查看然后编辑某些设置。 Atm 我在滚动面板中进行了设置,然后我希望将面板添加到我的对话框中,对话框底部有 "Save" 和 "Cancel" 按钮。我可以模糊地得到我需要的东西,但滚动面板开始时非常小(一次甚至不显示一整行垂直文本),并且不会随对话框调整大小。这是我的代码的样子:
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 3.0 版修复了你的代码,它看起来和你想要的一样。它也适用于 2.8 版。让我解释一下你应该做什么。
- 增大对话框的大小。显示所有小部件是不够的。
wx.Dialog.__init__(self, None, wx.ID_ANY, 'Settings', size=(300, 300), ...
- 像这样
scrolled.ScrolledPanel.__init__(self, parent, -1, size=(200, 200))
为你的
ScrolledPanel
添加一个 size
参数
就是这样。希望这有帮助。