[英]Multi-Threading Tkinter Python
我正在嘗試使用OBDII和tkinter作為GUI創建工具集群。 問題是,GUI沒有響應,繪制時間非常糟糕,因為我只有1個線程。 我是python和OOP概念的新手,也是我不確定如何繼續此處的原因。 這就是我想要做的,我想要兩個線程,一個用於繪圖,而另一個也處理數據。 我也可以使用多個線程來繪制對象嗎? 任何幫助表示贊賞
import tkinter as tk
from PIL import ImageTk
from PIL import Image
import datetime
import obd
class SimpleApp(object):
def __init__(self, master, **kwargs):
self.master = master
self.canvas = tk.Canvas(width=1400, height=800)
self.canvas.pack()
self.update = self.draw().__next__
master.after(1, self.update)
def draw(self):
image_bk = Image.open("img/1.png")
image = Image.open("img/2.png")
image1 = Image.open("img/3.png")
image_prnd = Image.open("img/4.png")
angle = 2 # 0 -> 270
angle1 = 0 # 0 -> 89
Speed = 0
RPM = 0
Fuel = 0
Temp = 0
Time = ' '
tkimage_bk = ImageTk.PhotoImage(image_bk)
self.canvas.create_image(700, 400, image=tkimage_bk)
self.canvas.create_text(100, 770, fill="white", font="BatmanForeverOutline 20 bold", text=" 70 F")
tkimage_prnd = ImageTk.PhotoImage(image_prnd)
while True:
tkimage = ImageTk.PhotoImage(image.rotate(angle))
tkimage1 = ImageTk.PhotoImage(image1.rotate(angle1))
canvas_obj = self.canvas.create_image(690, 400, image=tkimage)
canvas_obj1 = self.canvas.create_image(700, 400, image=tkimage1)
self.canvas.create_image(700, 400, image=tkimage_prnd)
self.canvas.create_text(700, 350, fill="white", font="BatmanForeverAlternate 20 bold ", text="MPH")
self.canvas.create_text(700, 525, fill="white", font="BatmanForeverAlternate 20 bold ", text="RPM")
self.canvas.create_text(700, 655, fill="white", font="BatmanForeverOutline 22 bold ", text="P R N S")
self.canvas.create_text(760, 655, fill='white', font="BatmanForeverAlternate 45 ", text="D")
speed = self.canvas.create_text(700, 290, fill="white", font="Beyond 80 ", text=str(Speed))
rpm = self.canvas.create_text(700, 465, fill="white", font="Beyond 65 ", text=str(RPM))
temp = self.canvas.create_text(1250, 240, fill="white", font="BatmanForeverOutline 22 ",text=str(Temp) + " F")
fuel = self.canvas.create_text(1250, 470, fill='white', font="BatmanForeverOutline 22 ", text=str(Fuel) + " %")
time1 = self.canvas.create_text(1000, 770, fill="white", font="BatmanForeverOutline 20 bold", text=datetime.datetime.now().strftime("%a, %d %B"))
time2 = self.canvas.create_text(1250, 770, fill="white", font="BatmanForeverOutline 20 bold", text=datetime.datetime.now().strftime("%I : %M : %S"))
run_time = self.canvas.create_text(500, 770, fill="white", font="BatmanForeverOutline 20 bold",text=str(Time))
self.master.after_idle(self.update)
yield
self.canvas.delete(time1)
self.canvas.delete(canvas_obj)
self.canvas.delete(canvas_obj1)
self.canvas.delete(time1)
self.canvas.delete(time2)
self.canvas.delete(run_time)
self.canvas.delete(temp)
self.canvas.delete(fuel)
self.canvas.delete(speed)
self.canvas.delete(rpm)
RPM = str(connection.query(cmd).value)
RPM = RPM.split()
RPM = int(RPM[ 0 ])
Speed = str(connection.query(cmd1).value)
Speed = Speed.split()
Speed = int(Speed[ 0 ] / 1.60934)
Temp = str(connection.query(cmd2).value)
Temp = float(Temp.split()[ 0 ])
Time = str(connection.query(cmd3).value)
Time = int(Time.split()[ 0 ])
Fuel = str(connection.query(cmd4).value)
Fuel = int(float(Fuel.split()[ 0 ]))
if (Speed > -1 and Speed < 21):
angle = (Speed * 0.75)
angle = 360 - angle
else:
angle = ((20 * 0.75) + ((Speed - 20) * 1.5))
angle = 360 - angle
if (RPM > -1 and RPM < 1000):
angle1 = 0.016 * RPM
else:
angle1 = 16 + (RPM - 1000) * 0.0296
connection = obd.OBD()
cmd = obd.commands.RPM
cmd1 = obd.commands.SPEED
cmd2 = obd.commands.COOLANT_TEMP
cmd3 = obd.commands.RUN_TIME
cmd4 = obd.commands.FUEL_LEVEL
root = tk.Tk()
app = SimpleApp(root)
root.mainloop()
據我所知,tkinter錯誤地處理了對gui的更改,而不是從主線程進行的更改。 但是您可以在其他線程中執行計算並轉移到主線程中。
注意方法后的tkinter。 使用它,您可以每隔一段時間檢查流中的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.