为什么在wxPython中关闭对话框时会出现一个小窗口?

为什么在wxPython中关闭对话框时会出现一个小窗口?,wxpython,panels,Wxpython,Panels,我有一个调用wx.Dialog的wx.Frame 现在,它们都可以相应地工作,并且可以很好地打开。问题是,当他们这样做的时候,他们也会打开一个小“窗口”,它位于我的框架的左上角,然后我就不能用鼠标自动调整框架的大小了。关闭对话框无效,因为那个小窗口仍然在那里 在我的wx.Frame中,我有以下事件调用: def OnTerminalSettings(self, event): """Open Terminal settings dialog""" dlg = TerminalSe

我有一个调用
wx.Dialog
wx.Frame

现在,它们都可以相应地工作,并且可以很好地打开。问题是,当他们这样做的时候,他们也会打开一个小“窗口”,它位于我的框架的左上角,然后我就不能用鼠标自动调整框架的大小了。关闭
对话框
无效,因为那个小窗口仍然在那里

在我的
wx.Frame
中,我有以下事件调用:

def OnTerminalSettings(self, event):
    """Open Terminal settings dialog"""
    dlg = TerminalSettingsDialog(self, wx.ID_ANY, "", settings=TerminalPanel(self).settings)
    dlg.ShowModal()
    dlg.Destroy()
终端设置对话框
wx.Dialog
如下所示:

class TerminalSettingsDialog(wx.Dialog):
    """Simple dialog with common terminal settings."""

    def __init__(self, *args, **kwds):
        self.settings = kwds['settings']
        del kwds['settings']
        kwds["style"] = wx.DEFAULT_DIALOG_STYLE
        wx.Dialog.__init__(self, *args, **kwds)
        self.checkbox_echo = wx.CheckBox(self, wx.ID_ANY, "Local Echo")
        self.checkbox_unprintable = wx.CheckBox(self, wx.ID_ANY, "Show unprintable characters")
        self.radio_box_newline = wx.RadioBox(self, wx.ID_ANY, "Newline Handling", choices=["CR only", "LF only", "CR+LF"], majorDimension=0, style=wx.RA_SPECIFY_ROWS)
        self.button_ok = wx.Button(self, wx.ID_ANY, "OK")
        self.button_cancel = wx.Button(self, wx.ID_ANY, "Cancel")

        self.__set_properties()
        self.__do_layout()

        self.__attach_events()
        self.checkbox_echo.SetValue(self.settings.echo)
        self.checkbox_unprintable.SetValue(self.settings.unprintable)
        self.radio_box_newline.SetSelection(self.settings.newline)

    def __set_properties(self):
        self.SetTitle("Terminal Settings")
        self.radio_box_newline.SetSelection(0)
        self.button_ok.SetDefault()

    def __do_layout(self):
        sizer_2 = wx.BoxSizer(wx.VERTICAL)
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_4 = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, "Input/Output"), wx.VERTICAL)
        sizer_4.Add(self.checkbox_echo, 0, wx.ALL, 4)
        sizer_4.Add(self.checkbox_unprintable, 0, wx.ALL, 4)
        sizer_4.Add(self.radio_box_newline, 0, 0, 0)
        sizer_2.Add(sizer_4, 0, wx.EXPAND, 0)
        sizer_3.Add(self.button_ok, 0, 0, 0)
        sizer_3.Add(self.button_cancel, 0, 0, 0)
        sizer_2.Add(sizer_3, 0, wx.ALL|wx.ALIGN_RIGHT, 4)
        self.SetAutoLayout(1)
        self.SetSizer(sizer_2)
        sizer_2.Fit(self)
        sizer_2.SetSizeHints(self)
        self.Layout()

    def __attach_events(self):
        self.Bind(wx.EVT_BUTTON, self.OnOK, id = self.button_ok.GetId())
        self.Bind(wx.EVT_BUTTON, self.OnCancel, id = self.button_cancel.GetId())

    def OnOK(self, events):
        """Update data with new values and close dialog."""
        self.settings.echo = self.checkbox_echo.GetValue()
        self.settings.unprintable = self.checkbox_unprintable.GetValue()
        self.settings.newline = self.radio_box_newline.GetSelection()
        self.EndModal(wx.ID_OK)

    def OnCancel(self, events):
        """Do not update data, but rather close dialog."""
        self.EndModal(wx.ID_CANCEL)
我不知道这是否重要,但框架中有一个顶部
wx.Panel
,它依次包含另外两个
wx.Panel
s。我想在这样的面板中有一个终端

我从计算机上得到了终端的代码,所以我想他们工作得很好

谁能帮我一把吗

附录

这是
终端板内的代码

class TerminalPanel(wx.Panel):
    def __init__(self, *args, **kwds):
        self.serial = serial.Serial()
        self.serial.timeout = 0.5    #make sure that the alive event can be checked from time to time
        self.settings = TerminalSetup()  #Placeholder for the settings
        self.thread = None
        self.alive = threading.Event()

        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Panel.__init__(self, *args, **kwds)
        TextPanel.text_ctrl_output = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)

        self.__do_layout()
        # self.OnPortSettings(None)  #Call setup dialog on startup, opens port
        if not self.alive.isSet():
            self.Close()


    def StartThread(self):
        """Start the receiver thread."""
        self.thread = threading.Thread(target=self.ComPortThread)
        self.thread.setDaemon(1)
        self.alive.set()
        self.thread.start()


    def StopThread(self):
        """Stop the receiver thread, wait until it's finished."""
        if self.thread is not None:
            self.alive.clear()  #Clear alive event for thread
            self.thread.join()  #Wait until thread has finished
            self.thread = None  #Set flag as empty


    def __do_layout(self):
        """Set general layout """
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_1.Add(self.text_ctrl_output, 1, wx.EXPAND, 0)
        self.SetAutoLayout(1)
        self.SetSizer(sizer_1)
        self.Layout()

此语句正在创建
TerminalPanel
的新实例,该实例是每次创建对话框实例时的
self
的子实例。那是你的额外窗口。如果您已经在
TerminalPanel
的某个地方有了一个实例,那么您可能应该从中获取设置对象,而不是创建一个新对象。

非常有意义。我该怎么做?(很抱歉,我对此一无所知)--我附加了
TerminalPanel
的代码。假设在框架中创建了
TerminalPanel
的初始实例,则在创建时应保存对它的引用。类似于
self.termPanel=TerminalPanel(self)
然后在以后的
ontterminalsettings
中,您可以像这样使用它
dlg=terminalsettingsload(self,wx.ID_ANY,“,settings=self.termPanel.settings)
谢谢@robindurn。实例
TerminalPanel
是在另一个名为
TopPanel
wx.Dialog
类中创建的,而不是在
主窗口
wx.Frame
中创建的。我如何考虑到这一点来相应地设置它?我想我得到了它<代码>设置=自身。顶部面板。终端面板。设置
dlg = TerminalSettingsDialog(self, wx.ID_ANY, "", settings=TerminalPanel(self).settings)