0

私は Python と OOP が初めてで、通常は C と VHDL を使用します。「ウィンドウ」に定期的に値を表示する必要がありますが、表示できないようです。そのままでは、値は 1 回だけフェッチされ、Quit は機能しません。読んだ多くの投稿に基づいて変更しようとしましたが、機能しません。どんな助けでも大歓迎です。

これは、フォーラムでの 2 回目の投稿です。私の投稿が本来あるべきものではない場合はお知らせください。Python 2.7、wxPython 2.8、Windows 7 を使用

import wx
import threading

class RspBox(wx.Frame):


    def __init__(self, parent, title):
        super(RspBox, self).__init__(parent, title=title, size=(500, 500))  
        self.InitUI()
        self.Centre()
        self.Show()    

    def InitUI(self):
        sizer = wx.GridBagSizer(7, 7)#(y,x)

        self.Ybtn = wx.Button(self, label='Yellow')
        self.Gbtn = wx.Button(self, label='Green')
        self.Wbtn = wx.Button(self, label='White')
        self.Rbtn = wx.Button(self, label='Red')
        self.Bbtn = wx.Button(self, label='Blue')
        self.ApplyBtn = wx.Button(self, id=wx.ID_APPLY, label='')
        self.QuitBtn = wx.Button(self, id=wx.ID_ANY, label='Quit')
        self.Label1 = wx.StaticText(self, label='Direction')
        self.Label2 = wx.StaticText(self, label='Value')
        self.Dir = wx.TextCtrl(self, style=wx.TE_LEFT, value='000000')
        self.Val = wx.TextCtrl(self, style=wx.TE_READONLY, value='CAFE')
        self.t = self.SetDirection()

        sizer.Add(self.Ybtn, pos=(1, 2), span=(1, 1))
        sizer.Add(self.Gbtn, pos=(2, 1), span=(1, 1))
        sizer.Add(self.Wbtn, pos=(2, 2), span=(1, 1))
        sizer.Add(self.Rbtn, pos=(2, 3), span=(1, 1))
        sizer.Add(self.Bbtn, pos=(3, 2), span=(1, 1))
        sizer.Add(self.Label1, pos=(4, 1), span=(1, 1))
        sizer.Add(self.Dir, pos=(4, 2), span=(1, 2))
        sizer.Add(self.Label2, pos=(5, 1), span=(1, 1))
        sizer.Add(self.Val, pos=(5, 2), span=(1, 2))
        sizer.Add(self.ApplyBtn, pos=(6, 2), span=(1, 1))
        sizer.Add(self.QuitBtn, pos=(6, 3), span=(1, 1))

        self.Bind(wx.EVT_BUTTON, self.stop(self), self.QuitBtn)

        self.SetSizer(sizer)
        self.Fit()
        self.Show()


    def SetDirection(self):
        """Set the TextCtrl Direction field periodically"""
        Val = 3 #debug
        self.Val.SetValue(str(Val))
        t = threading.Timer(1, self.SetDirection)
        t.start()
        print "SetDirection = %s" % Val #debug
        return t


    def stop(self, event):
        self.t.cancel()


if __name__ == '__main__':
    print test
    app = wx.App()
    RspBox(None, title='ResponseBox')
    app.MainLoop()
4

1 に答える 1

0

スレッドを使用する場合は、wx.CallAfter や wx.PostEvent などのスレッドセーフなメソッドを使用して UI を更新する必要があります。ただし、実行時間の長いプロセスを使用するのではなく、時間に基づいて値を更新しているだけなので、スレッドの代わりに wx.Timer を使用できると思います。このトピックに関するいくつかのリンクを次に示します。

于 2013-05-01T15:34:21.497 に答える