为什么在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)