wxPython自定义对话框加载不正确
我正在尝试创建一个自定义对话框来显示信息。它是激活一个按钮按下,这一机制是完美的工作。但是,对话框本身被破坏了。感谢您的帮助wxPython自定义对话框加载不正确,python,user-interface,wxpython,modal-dialog,Python,User Interface,Wxpython,Modal Dialog,我正在尝试创建一个自定义对话框来显示信息。它是激活一个按钮按下,这一机制是完美的工作。但是,对话框本身被破坏了。感谢您的帮助 import wx class ForgotPass(wx.Dialog): def __init__(self, *args, **kwargs): super(ForgotPass, self).__init__(*args, **kwargs) self.InitUI() def InitUI(self):
import wx
class ForgotPass(wx.Dialog):
def __init__(self, *args, **kwargs):
super(ForgotPass, self).__init__(*args, **kwargs)
self.InitUI()
def InitUI(self):
self.panel = wx.Panel(self)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.title = wx.StaticText(self.panel, label='Forgotten Your Password?', style=wx.ALIGN_CENTER)
self.title.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, underline=True)) # Underlined & Bold
self.sizer.Add(self.title)
self.text = wx.StaticText(self.panel, label="Contact 'TheHiguty' via ingame PM to have your password reset!", style=wx.ALIGN_CENTER)
self.sizer.Add(self.text)
self.SetSizer(self.sizer)
self.SetSize((200, 150))
self.SetTitle('Forgotten Your Password')
self.Center()
self.Show(True)
def main():
app = wx.App(False)
ForgotPass(None)
app.MainLoop()
if __name__ == "__main__":
main()
但是,我没有正确显示文本,而是得到以下结果:
非常感谢您为解决此问题提供的任何帮助 在self.SetSizer(self.sizer)
之后添加self.sizer.Fit(self.panel)
,以修复该问题。
但是,如果您这样做,您会发现水平宽度太小,因此您可能需要扩展它。使用修复程序完成代码:
import wx
class ForgotPass(wx.Dialog):
def __init__(self, *args, **kwargs):
super(ForgotPass, self).__init__(*args, **kwargs)
self.InitUI()
def InitUI(self):
self.panel = wx.Panel(self)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.title = wx.StaticText(self.panel, label='Forgotten Your Password?', style=wx.ALIGN_CENTER)
self.title.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, underline=True)) # Underlined & Bold
self.sizer.Add(self.title)
self.text = wx.StaticText(self.panel, label="Contact 'TheHiguty' via ingame PM to have your password reset!", style=wx.ALIGN_CENTER)
self.sizer.Add(self.text)
self.SetSizer(self.sizer)
self.sizer.Fit(self.panel)
self.SetSize((400, 150))
self.SetTitle('Forgotten Your Password')
self.Center()
self.Show(True)
def main():
app = wx.App(False)
ForgotPass(None)
app.MainLoop()
if __name__ == "__main__":
main()
尽管如此,还是有一种方法可以创建对话框,使其看起来更干净,并且对于运行程序的任何操作系统来说都更原生:use
下面是一个简单的例子:
import wx
class MainWindow(wx.Frame):
def __init__(self, parent):
super(MainWindow, self).__init__(parent)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.button = wx.Button(self, wx.ID_ANY, label="Test")
self.sizer.Add(self.button)
self.Bind(wx.EVT_BUTTON, self.password_dialog, self.button)
self.SetSizer(self.sizer)
self.sizer.Fit(self)
self.SetTitle('Test')
self.SetSize((100, 100))
self.Centre()
self.Show(True)
def password_dialog(self, event):
wx.MessageBox(
'Contact `TheHiguty` blah blah blah',
'Forgotten your password?',
wx.OK|wx.ICON_ERROR)
if __name__ == '__main__':
app = wx.App()
MainWindow(None)
app.MainLoop()
我知道这是一个较老的问题,但我想指出我在自定义对话框中使用了什么,并且没有“噪音/图标”(至少在我看来)。这是与wxPython 2.9.5.0一起使用的 这是我使用的代码:
from wx.lib.pubsub import pub
def showConfirmDlg(message, caption, flag=wx.OK|wx.ICON_NONE):
msg = wx.MessageDialog(None, message=message,
caption=caption, style=flag)
msg.ShowModal()
msg.Destroy()
pub.subscribe(showConfirmDlg, 'dialog.confirm')
正如您在代码段中所看到的,我可以对各种消息重复使用此函数,并且消除了对多个函数定义的需要。要使用示例中的文本显示对话框,我将执行以下操作:
def onButtonPress(self, event):
pub.sendMessage('dialog.confirm',
message="Forgot your password?\n Contact 'TheHiguty' (rest of text)",
caption="Forgot Password?") # Could even just put caption=""
对于进一步的可重用性选项,您可以将“flag=wx.OK | wx.ICON_NONE”替换为“flag”,并在函数调用中添加“flag=wx.OK |(任意样式)”
关于Python和wxPython的更多例子,我强烈推荐Mike Driscoll的博客站点,我发现它信息量惊人,并且从Driscoll先生那里学到了很多关于wxPython的知识
希望这能帮助你和其他人
--编辑--
我应该提到的是,我在自己尝试从消息框中删除图标时意外发现wx.ICON\u NONE。您创建了对话框,但没有对其执行任何操作(无变量,无
app.SetTopWindow()
。这是有意的吗?它是从wx.Frame的按钮按下调用的,这只是一个显示问题的较短示例。我还需要这些东西吗?很好,谢谢。有没有办法在没有噪音或图标的情况下创建消息框?我曾短暂地尝试过,但我使用了一个自定义框来避免噪音和图标。@LukeAshford:啊,在这种情况下,我不知道有什么好方法。像你那样做一个自定义消息框可能是正确的方法!我花了太多时间试图扩展对话框,这个例子帮助我让它工作。