#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
с текстом после старого — таким образом, у вас будет много меток в окне, но каждая метка может иметь разный цвет фона.