我正在尝试创建一个自定义对话框来显示信息。它在按下按钮时激活,该机制工作正常。但是,对话框本身已被破坏。任何帮助表示赞赏。
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()
然而,不是正确地显示文本,我得到了这个:
非常感谢您解决此问题的任何帮助!
答案 0 :(得分:1)
在self.sizer.Fit(self.panel)
之后添加self.SetSizer(self.sizer)
以解决问题。
虽然如果你这样做,你会发现水平宽度太小,所以你可能想要扩展它。包含修复的完整代码:
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()
尽管如此,有一种方法可以创建看起来更干净的对话框,并且对于运行该程序的操作系统看起来更原生:使用wx.MessageBox
这是一个简单的例子:
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()
答案 1 :(得分:0)
我知道这是一个较旧的问题,但我想注意我用于自定义对话框的内容,并且没有“噪音/图标”(至少在我看来)。这适用于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”替换“flag = wx.OK | wx.ICON_NONE”,并在函数调用中添加“flag = wx.OK |(无论样式)”。
有关Python和wxPython的更多示例,我强烈推荐Mike Driscoll的博客网站The Mouse vs The Python.我发现它非常有用,并且从Driscoll先生那里学到了很多关于wxPython的知识。
希望这可以帮助你和其他人!
- EDIT-- 我应该提一下,我在尝试从我的消息框中删除图标时偶然发现了wx.ICON_NONE。