如何将方法作为命令调用到ticker按钮中

2024-04-29 05:44:03 发布

您现在位置:Python中文网/ 问答频道 /正文

在tkintergui中,我创建了一个run按钮。我喜欢按一下按钮,然后它应该开始计数。但是当我把这个方法作为命令调用到ttk.Button中时。它不起作用。在这段代码中创建了两个类。run方法是在第一个类中创建的,它将被调用到第二个类中。请您核对一下密码好吗。提前谢谢

    from tkinter import *
    import threading
    import queue
    from time import sleep
    import random
    from tkinter import ttk

    class Thread_0(threading.Thread):

        def __init__(self):
            threading.Thread.__init__(self)
        def run(self):
            count = 0
            while True:
                count +=1
                hmi.thread_0_update(count)
                sleep(random.random()/100)


     class HMI:
        def __init__(self):
            self.master=Tk()
            self.master.geometry('200x200+1+1')

            self.f=ttk.Frame(self.master,height = 100, width = 100, relief= 'ridge')

            self.f.grid(row=1,column=1, padx=20, pady=20)

            self.l0=ttk.Label(self.f)
            self.l0.grid(row=1,column=1)

            self.button=ttk.Button(self.master, text = 'run')
            self.button.grid(row=2,column=2)

            self.q0=queue.Queue()

            self.master.bind("<<Thread_0_Label_Update>>",self.thread_0_update_e)

        def start(self):
            self.master.mainloop()
            self.master.destroy()

    #################################
        def thread_0_update(self,val):
            self.q0.put(val)

            self.master.event_generate('<<Thread_0_Label_Update>>',when='tail')
        def thread_0_update_e(self,e):
            while self.q0.qsize():
                try:
                   val=self.q0.get()
                   self.l0.config(text=str(val), font = ('Times New Roman', 15))
                except queue.Empty:
                    pass


##########################
    if __name__=='__main__':
        hmi=HMI()
        t0=Thread_0()
        t0.start()
        hmi.start()

Tags: runfromimportselfmasterqueuedefupdate
1条回答
网友
1楼 · 发布于 2024-04-29 05:44:03

你可以用

 Button( ..., command=t0.start )

请参阅:start没有()。但是你必须在hmi之前创建t0

if __name__ == '__main__':
    t0 = Thread_0()
    hmi = HMI()
    hmi.start()

对我有用的完整代码

from tkinter import *
import threading
import queue
from time import sleep
import random
from tkinter import ttk

class Thread_0(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        count = 0
        while True:
            count +=1
            hmi.thread_0_update(count)
            sleep(random.random()/100)


class HMI:

    def __init__(self):
        self.master=Tk()
        self.master.geometry('200x200+1+1')

        self.f = ttk.Frame(self.master, height=100, width=100, relief='ridge')

        self.f.grid(row=1, column=1, padx=20, pady=20)

        self.l0 = ttk.Label(self.f)
        self.l0.grid(row=1, column=1)

        self.button = ttk.Button(self.master, text='run', command=t0.start)
        self.button.grid(row=2, column=2)

        self.q0 = queue.Queue()

        self.master.bind("<<Thread_0_Label_Update>>", self.thread_0_update_e)

    def start(self):
        self.master.mainloop()
        self.master.destroy()

#################################
    def thread_0_update(self,val):
        self.q0.put(val)

        self.master.event_generate('<<Thread_0_Label_Update>>', when='tail')
    def thread_0_update_e(self,e):
        while self.q0.qsize():
            try:
               val = self.q0.get()
               self.l0.config(text=str(val), font=('Times New Roman', 15))
            except queue.Empty:
                pass


##########################
if __name__ == '__main__':
    t0 = Thread_0()
    hmi = HMI()
    hmi.start()

相关问题 更多 >