多线程Tkinter Python
我正在尝试使用OBDII和tkinter作为GUI创建一个工具集群。 问题是,GUI没有响应,绘制时间非常糟糕,因为我只有一个线程。 我是python和OOP概念的新手,这也是我不确定如何在这里继续的原因。 这就是我想要做的,我想要两个线程,一个用于绘图,另一个也用于处理数据。 我也可以使用多个线程来绘制对象吗? 谢谢你的帮助多线程Tkinter Python,python,multithreading,tkinter,Python,Multithreading,Tkinter,我正在尝试使用OBDII和tkinter作为GUI创建一个工具集群。 问题是,GUI没有响应,绘制时间非常糟糕,因为我只有一个线程。 我是python和OOP概念的新手,这也是我不确定如何在这里继续的原因。 这就是我想要做的,我想要两个线程,一个用于绘图,另一个也用于处理数据。 我也可以使用多个线程来绘制对象吗? 谢谢你的帮助 import tkinter as tk from PIL import ImageTk from PIL import Image import datetime im
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作为tk导入
从PIL导入ImageTk
从PIL导入图像
导入日期时间
进口obd
类SimpleApp(对象):
定义初始(自我、主控、**kwargs):
self.master=master
self.canvas=tk.canvas(宽度=1400,高度=800)
self.canvas.pack()
self.update=self.draw()。\u下一步__
master.after(1,自我更新)
def牵引(自):
image\u bk=image.open(“img/1.png”)
image=image.open(“img/2.png”)
image1=Image.open(“img/3.png”)
image\u prnd=image.open(“img/4.png”)
角度=2#0->270
角度1=0#0->89
速度=0
RPM=0
燃料=0
温度=0
时间=“”
tkimage_bk=图像TK.照片图像(图像_bk)
self.canvas.create_image(700400,image=tkimage_bk)
self.canvas.create_text(100770,fill=“white”,font=“BatmanForeverOutline 20粗体”,text=“70 F”)
tkimage\u prnd=图像tk.PhotoImage(图像\u prnd)
尽管如此:
tkimage=ImageTk.PhotoImage(图像旋转(角度))
tkimage1=图像TK.照片图像(图像1.旋转(角度1))
canvas\u obj=self.canvas.create\u image(690400,image=tkimage)
canvas_obj1=self.canvas.create_image(700400,image=tkimage1)
self.canvas.create_image(700400,image=tkimage_prnd)
self.canvas.create_text(700350,fill=“white”,font=“BatmanForeverAlternate 20 bold”,text=“MPH”)
self.canvas.create_text(700525,fill=“white”,font=“BatmanForeverAlternate 20 bold”,text=“RPM”)
self.canvas.create_text(700655,fill=“white”,font=“BatmanForeverOutline 22 bold”,text=“prn S”)
self.canvas.create_text(760655,fill='white',font=“BatmanForeverAlternate 45”,text=“D”)
speed=self.canvas.create_text(700290,fill=“white”,font=“Beyond 80”,text=str(speed))
rpm=self.canvas.create_text(700465,fill=“white”,font=“Beyond 65”,text=str(rpm))
temp=self.canvas.create_text(1250240,fill=“white”,font=“BatmanForeverOutline 22”,text=str(temp)+“F”)
fuel=self.canvas.create_text(1250470,fill='white',font=“BatmanForeverOutline 22”,text=str(fuel)+“%”)
time1=self.canvas.create_text(1000770,fill=“white”,font=“BatmanForeverOutline 20 bold”,text=datetime.datetime.now().strftime(“%a,%d%B”))
time2=self.canvas.create_text(1250770,fill=“white”,font=“BatmanForeverOutline 20 bold”,text=datetime.datetime.now().strftime(“%I:%M:%S”))
运行时间=self.canvas.创建文本(500770,fill=“white”,font=“BatmanForeverOutline 20 bold”,text=str(时间))
空闲后的self.master(self.update)
产量
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(运行时)
self.canvas.delete(临时)
self.canvas.delete(燃料)
self.canvas.delete(速度)
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()
速度=整数(速度[0]/1.60934)
Temp=str(connection.query(cmd2.value)
临时=浮动(临时拆分()[0])
Time=str(connection.query(cmd3.value)
Time=int(Time.split()[0])
Fuel=str(connection.query(cmd4.value)
Fuel=int(浮动(Fuel.split()[0]))
如果(速度>-1且速度<21):
角度=(速度*0.75)
角度=360-角度
其他:
角度=((20*0.75)+((速度-20)*1.5))
角度=360-角度
如果(RPM>-1和RPM<1000):
角度1=0.016*RPM
其他:
角度1=16+(转速-1000)*0.0296
连接=obd.obd()
cmd=obd.commands.RPM
cmd1=obd.commands.SPEED
cmd2=obd.commands.COOLANT_TEMP
cmd3=obd.commands.RUN\u时间
cmd4=obd.commands.FUEL_液位
root=tk.tk()
app=SimpleApp(根目录)
root.mainloop()
据我所知,tkinter不正确地处理对gui的更改,而不是从主线程。但是,您可以在其他线程中执行计算,并转移到主线程
注意后处理方法。使用它,您可以每隔一段时间检查流中的数据