我的代码:
class ConnectingPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE, pos=(-2, -2), size=(387, 267))
self.control.SetForegroundColour((34,139,34))
self.control.SetBackgroundColour((0,0,0))
self.control.Disable()
self.control.AppendText("Connecting to device")
self.device = Connection(#info goes here)
self.control.AppendText("Connected to device")
因此,我的代码可以看出,我正在尝试生成一个带有“status”文本框的面板self.control。我的想法是我使用pysftp连接到远程设备,并且我希望每次执行操作时都向状态文本框添加一行。第一个是连接到主机。但是,我的面板只有在代码连接到主机后才显示,即使之前制作面板等的代码也是如此。
我该怎么办?没有错误,只是这种奇怪的行为。 谢谢!
答案 0 :(得分:1)
如前所述,这是因为你在构造函数中这样做。
使用wx.CallAfter:
class ConnectingPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE, pos=(-2, -2), size=(387, 267))
self.control.SetForegroundColour((34,139,34))
self.control.SetBackgroundColour((0,0,0))
self.control.Disable()
wx.CallAfter(self.start_connection)
def start_connection(self):
self.control.AppendText("Connecting to device")
self.device = Connection(#info goes here)
self.control.AppendText("Connected to device")
答案 1 :(得分:0)
您正尝试在面板的构造函数中修改面板,但面板仅在构造函数执行后显示(在.MainLoop()
和/或.Show()
调用之后的某处)。
这样做的正确方法是为事件(cf doc)注册处理程序
import wx.lib.newevent
import threading
class ConnectingPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE, pos=(-2, -2), size=(387, 267))
self.control.SetForegroundColour((34,139,34))
self.control.SetBackgroundColour((0,0,0))
self.control.Disable()
self.MyNewEvent, self.EVT_MY_NEW_EVENT = wx.lib.newevent.NewEvent()
self.Bind(self.EVT_MY_NEW_EVENT, self.connected_handler) # you'll have to find a correct event
thread = threading.Thread(target=self.start_connection)
thread.start()
def start_connection(self):
self.control.AppendText("Connecting to device")
self.device = Connection(#info goes here)
evt = self.MyNewEvent()
#post the event
wx.PostEvent(self, evt)
def connected_handler(self, event):
self.control.AppendText("Connected to device")
编辑:为连接添加了线程启动,以避免阻塞操作以阻止显示。