Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多线程Tkinter Python_Python_Multithreading_Tkinter - Fatal编程技术网

多线程Tkinter Python

多线程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

我正在尝试使用OBDII和tkinter作为GUI创建一个工具集群。 问题是,GUI没有响应,绘制时间非常糟糕,因为我只有一个线程。 我是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作为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的更改,而不是从主线程。但是,您可以在其他线程中执行计算,并转移到主线程

注意后处理方法。使用它,您可以每隔一段时间检查流中的数据