Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxPython自定义对话框加载不正确_Python_User Interface_Wxpython_Modal Dialog - Fatal编程技术网

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:啊,在这种情况下,我不知道有什么好方法。像你那样做一个自定义消息框可能是正确的方法!我花了太多时间试图扩展对话框,这个例子帮助我让它工作。