【问题标题】:Tkinter scale in realtimeTkinter 实时缩放
【发布时间】:2013-10-23 06:16:59
【问题描述】:

通过修改 Stackoverflow 中的一个答案中存在的一些代码(对不起,我不记得它到底是哪一个),这里是代码 sn-p。 我试图通过使用tkinter scale 来改进它。

#!/usr/bin/env python

from Tkinter import *
import threading

class MyTkApp(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.start()
    def callback(self):
       self.root.quit()
    def show_values(self):
       print self.s2.get()
       print self.s1.get()
    def run(self):
        self.root=Tk()
        self.root.protocol("WM_DELETE_WINDOW", self.callback)
        self.s1 = Scale(self.root, from_=0, to=42, tickinterval=8)
    self.s1.set(19)
    self.s1.pack()
    self.s1.get()
    self.s2 = Scale(self.root, from_=0, to=200, length=600,tickinterval=10, orient=HORIZONTAL)
    self.s2.set(23)
    self.s2.pack()
    Button(self.root, text='Show', command=self.show_values).pack()
    self.root.mainloop()

app = MyTkApp()
print app.show_values()    
for a in range(0,10):
    print 'now can continue running code while mainloop runs'

我正在尝试获取这些值并将其实时返回到主循环的其余部分。 我们如何做到这一点?

【问题讨论】:

    标签: python linux tkinter


    【解决方案1】:

    不使用线程,而是使用回调(使用 command 关键字参数指定)

    from Tkinter import *
    
    def show_values(value=None):
        print s1.get(), s2.get()
    
    root=Tk()
    s1 = Scale(root, from_=0, to=42, tickinterval=8, command=show_values)
    #                                                ^^^^^^^^^^^^^^^^^^^
    s1.set(19)
    s1.pack()
    s2 = Scale(root, from_=0, to=200, length=600, tickinterval=10, orient=HORIZONTAL,
               command=show_values) # <---
    s2.set(23)
    s2.pack()
    Button(root, text='Show', command=show_values).pack()
    root.mainloop()
    

    当刻度值改变时调用回调。


    更新

    from Tkinter import *
    import time
    import threading
    
    class ScaleValue:
        def __init__(self):
            self.value1 = None
            self.value2 = None
    
    def tkinter_loop(scale):
        root=Tk()
        s1 = Scale(root, from_=0, to=42, tickinterval=8, command=lambda v: setattr(scale, 'value1', v))
        s1.set(19)
        s1.pack()
        s2 = Scale(root, from_=0, to=200, length=600, tickinterval=10, orient=HORIZONTAL, command=lambda v: setattr(scale, 'value2', v))
        s2.set(23)
        s2.pack()
        root.mainloop()
    
    scale = ScaleValue()
    threading.Thread(target=tkinter_loop, args=(scale,)).start()
    
    # ROP
    while 1:
        time.sleep(1)
        print scale.value1, scale.value2
    

    【讨论】:

    • 回调的问题是程序的其余部分在scale关闭之前无法继续执行。
    • @pistal,如何在线程中运行程序的其余部分
    • rest of the program 已经在没有线程的情况下编写,更改该部分看起来不可行。在这里找到了一些东西:http://stackoverflow.com/questions/17257045/trying-to-get-the-value-from-a-tkinter-scale-and-put-it-into-a-label仍在弄清楚如何实现它
    • 程序的其余部分是做什么的?
    • 让我们将rest of the program 称为ROP。它正在尝试使用从各种performance countersmsr registers 收集的数据进行一些计算。当然,python 并不是提高效率的最佳方式。但它是最快的概念证明(至少对我来说)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多