0

私は Python プログラミングの非常に初心者であり、なぜウィジェットが繰り返し数値を表示できないのか疑問に思っています。つまり、テキストに 1 から 9 までの数字を表示させたいのですが、while ループでは 9 しか表示されません。

これが私のコードです(Pythonバージョン:2.6):

#!/user/bin/python


import wx

class Frame(wx.Frame):
def __init__(self,parent,id):
    wx.Frame.__init__(self, parent, id,
                      'Show Number',
                      size = (200,150),
                      style=wx.MINIMIZE_BOX | wx.RESIZE_BORDER 
| wx.SYSTEM_MENU | wx.CAPTION |  wx.CLOSE_BOX)
    self.initUI()

def initUI(self):

    widgetPanel=wx.Panel(self, -1)
    widgetPanel.SetBackgroundColour('white')

    # Buttons for play the simulation
    playButton = wx.Button(widgetPanel, -1, "Play", pos=(10,10), size=(30,30))

    self.Bind(wx.EVT_BUTTON, self.play, playButton)
    playButton.SetDefault()

    # Time
    self.timeText = wx.TextCtrl(widgetPanel, -1, "", pos=(10, 50), 
                            size =(100,30), style=wx.TE_CENTER)
    self.timeText.SetBackgroundColour('white')
    self.timeText.SetFont(wx.Font(20, wx.DECORATIVE, wx.NORMAL, wx.NORMAL))

def play(self, event):
    #self.timeText.SetValue("19:32")
    self.show_num()

def show_num(self):
    x = 0
    while(x < 10):
        self.timeText.SetValue(str(x))
        x += 1

if __name__ == "__main__":
    app = wx.App(False)
    frame = Frame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()
4

3 に答える 3

1

アプリに更新の機会を与える必要があります....これを行う最も簡単で最も正しい方法は、ループの代わりにタイマーを使用することです...最小限の例を含めました

import wx
app = wx.App(redirect=False)
frame = wx.Frame(None,-1,"Counter")
btn = wx.Button(f,-1,"Click Me!")
timer = wx.Timer() # this will update the count

def onUpdateButton(evt):
    next_int = int(btn.GetLabel())+1
    btn.SetLabel(str(next_int))
    if next_int > 10:
        timer.Stop()
        btn.Enable(True)


def onButtonClick(event):
    btn.SetLabel("0")
    btn.Enable(False)
    timer.Start(1000) # 1 second updates

timer.Bind(wx.EVT_TIMER,onUpdateButton)    
btn.Bind(wx.EVT_BUTTON,onButtonClick)
frame.Show()
app.MainLoop()

おそらくほとんどのユーザーには明らかですが、現在のカウントで変数を保持する代わりに、ラベル文字列を使用していることに言及する価値があるかもしれません

于 2014-07-01T16:04:50.450 に答える
0

次の更新の問題が発生しました。

self.timeText.SetValue(str(x))
time.sleep(1)
x += 1

スリープの前に wx.YieldIfNeeded() を追加しました。

self.timeText.SetValue(str(x))
wx.YieldIfNeeded()
wx.sleep(1)
x += 1

これにより、GUI が更新され、他のイベントが処理されるようになります。wx.Sleep() も使用します。これにより、他のライブラリを使用できなくなります...

于 2014-07-04T09:46:21.287 に答える