wxPython + pysftp не будет работать одновременно - PullRequest
0 голосов
/ 25 июля 2011

Мой код:

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 ]

1 голос
/ 25 июля 2011

Как уже упоминалось, это потому, что вы делаете это в конструкторе.

Использование 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")
0 голосов
/ 25 июля 2011

Вы пытаетесь изменить панель в конструкторе панели, но панель отображается только после выполнения конструктора (где-то после вызова .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")

РЕДАКТИРОВАТЬ: Добавлен многопоточный запуск для запуска соединения, чтобы избежать операции блокировки thazt block display.

...