2

我正在尝试创建一个自定义对话框来显示信息。它在按下按钮时被激活,并且该机制运行良好。但是,对话框本身已损坏。任何帮助表示赞赏。

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()

但是,我没有正确显示文本,而是得到了这个:

在此处输入图像描述

非常感谢任何解决此问题的帮助!

4

2 回答 2

2

添加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()
于 2013-01-01T20:43:32.587 回答
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=wx.OK|wx.ICON_NONE”替换为“flag”,并将“flag=wx.OK|(whatever style)”添加到您的函数调用中。

有关 Python 和 wxPython 的更多示例,我强烈推荐 Mike Driscoll 的博客站点The Mouse vs The Python。我发现它的信息量惊人,并且从 Driscoll 先生那里学到了很多关于 wxPython 的知识。

希望这对您和其他人有所帮助!

--EDIT-- 我应该提到我在尝试自己从消息框中删除图标时偶然发现了 wx.ICON_NONE。

于 2013-10-10T03:00:35.690 回答