如何在while循环tkinter中连续输出比例尺

时间:2014-04-28 15:08:34

标签: python get while-loop tkinter

我使用tkinter编程了一个gui并实现了一个缩放栏来改变变量。 我试图在while循环中获得此scalebar的输出。 会发生什么:

  1. 按钮按下状态= True
  2. 使用get()方法阅读比例尺
  3. 将变量传递给其他函数(播放具有一定延迟的声音)
  4. 检查比例尺 - > 1。
  5. 第二个按钮按下设置状态= False - >退出时循环
  6. 我的代码卡住了,当我在while循环中时我无法更改比例尺,我不得不强制退出我的代码

    我希望你有任何想法!代码示例如下,如果您需要更多或整个源代码,请告诉我

    致以最诚挚的问候,

    SevenDeath

    class FunctionClassTest:
        def __init__(self):
            pass
    
        def intimeSTOP(self):
            self.Test = False
    
        def intime(self):
            self.test=True
            while self.test:
                self.TestTmp = scalebarTime.get()
                if self.TestTmp < 0:
    ...
                   playsound
    ...
    online = FunctionClassTest()
    
    buttonC = Button(window, text="Test On", command=online.intime)
    buttonD = Button(window, text="Test Off", command=online.intimeSTOP)
    

1 个答案:

答案 0 :(得分:1)

问题是while循环。它与Tkinter循环冲突并有效地锁定GUI,同时连续执行循环,使GUI无响应。您必须轻松处理同时任务的一个选项是after方法。这是一个例子:

class App(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.timer = None # initalize timer variable

        self.slide = Scale(self)
        self.slide.pack()

        Button(self, text='go', command=self._start).pack()
        Button(self, text='stop', command=self._stop).pack()

    def _start(self):
        if self.slide.get() > 0:
            # ... code here ... ie, print self.slide.get()
            # set timer to after method, calling it every 1000ms
            self.timer = self.after(1000, self._start)

    def _stop(self):
        if self.timer is not None:
            # cancel timer, stopping the _start method from looping
            self.after_cancel(self.timer)

root = Tk()
app = App(root)
app.pack()
root.mainloop()

有关after方法的详情,请参阅:http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method