0

我的代码:

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

因此,从我的代码可以看出,我正在尝试生成一个带有“状态”文本框 self.control 的面板。这个想法是我正在使用 pysftp 连接到远程设备,并且我希望它在每次发生操作时在状态文本框中添加一行。第一个只是连接到主机。但是,我的面板仅在代码连接到主机后才显示,即使用于制作面板等的代码在之前。

我能做些什么?没有错误,只是这种奇怪的行为。谢谢!

4

2 回答 2

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")
于 2011-07-25T11:36:09.510 回答
0

您正在尝试在面板的构造函数中修改面板,但面板仅在构造函数执行后显示(在.MainLoop()and/or.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")

编辑:为连接开始添加线程启动以避免阻塞操作 thazt 块显示。

于 2011-07-25T09:50:18.030 回答