Как вызвать метод в кнопке бегущей строки как команду

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

В графическом интерфейсе tkinter я создал кнопку запуска. Мне понравилось нажимать на кнопку, тогда она должна начать отсчет. Но когда я вызываю метод в ttk.Кнопка как команда. это не работает. В этом коде было создано два класса. метод 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()
  

Комментарии:

1. вы получаете сообщение об ошибке? Всегда ставьте под сомнение значение full Traceback .

Ответ №1:

Вы можете использовать

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

Смотрите: start без () . Но вы должны создать t0 перед hmi

 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()
  

Комментарии:

1. Большое вам спасибо. Это работает отлично. Один вопрос, можно ли ставить число один за другим, а не заменять. Что я имею в виду, я хочу иметь все числа в фрейме, тексте или главном.

2. вы можете получить весь текст из метки, объединить новый текст и поместить его обратно — self.l0.config(text=self.l0.cget("text") str(val)) или self.l0["text"] = self.l0["text"] str(val) . С помощью Text() вы можете вставить новый текст в конце text.insert("end", str(val)) . Вы также можете добавить новый Label с текстом после старого — таким образом, у вас будет много меток в окне, но каждая метка может иметь разный цвет фона.