wxPython + pysftp不能同时工作

时间:2011-07-25 09:06:05

标签: python ssh connection wxpython pysftp

我的代码:

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连接到远程设备,并且我希望每次执行操作时都向状态文本框添加一行。第一个是连接到主机。但是,我的面板只有在代码连接到主机后才显示,即使之前制作面板等的代码也是如此。

我该怎么办?没有错误,只是这种奇怪的行为。 谢谢!

2 个答案:

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

编辑:为连接添加了线程启动,以避免阻塞操作以阻止显示。