在python 2.7生成的Tkinter窗口中基于arduino输入切换图像不会显示图像

时间:2017-11-06 13:04:07

标签: python python-2.7 tkinter tkinter-canvas

我编写了一个Arduino代码,它对按钮和物理交互做出反应,然后将结果发送到运行我的python程序(2.7)的计算机上。 python代码有两个函数:

  1. 创建一个以unixtimestamp命名的新文本文件并填充它 收到所有数据。
  2. 查看收到的代码短语"a1""b1"的数据 然后显示相应的图像。
  3. 当Arduino启动时,它将发送"a1"作为填充窗口的第一个值。之后,它应该根据它发送的数据进行切换。

    这是我目前的代码:

    from Tkinter import *
    from random import *
    import serial
    import time
    
    root = Tk()
    prompt = StringVar()
    root.title("vision")
    label = Label(root, fg="dark green")
    label.pack()
    frame = Frame(root,background='red')
    frame.pack()
    
    canvas = Canvas(height=200,width=200)
    canvas.pack()
    
    
    timestamp = int(time.time())
    filename=str(timestamp)+".txt"
    f = open(str(filename),"w") 
    f.write("\n")
    f.write(str(filename))
    f.write("\n")
    
    
    arduino = serial.Serial('COM5', 115200, timeout=.1)
    while True:
        data = arduino.readline()[:-2] #the last bit gets rid of the new-line chars
        print data
        f.write(str(data))
        f.write("\n")
        #Invoking through button
        TextWindow = Label(frame,anchor = NW, justify = LEFT, bg= 'white', fg   = 'blue', textvariable = prompt, width = 75, height=20)
        TextWindow.pack(side = TOP)
    
        if data == "a1": 
          canvas.delete("all")
          image1 = PhotoImage(file = "c2.gif")
          canvas.create_image(0,0,anchor='nw',image=image1)
          canvas.image = image1
    
    
        if data == "b1": 
          canvas.delete("all")
          image1 = PhotoImage(file = "c2.gif")
          canvas.create_image(0,0,anchor='nw',image=image1)
          canvas.image = image1
    
        root.mainloop() 
    

    它生成窗口但它是空的。 我似乎无法找到我的错误。

    Additionaly: 我使用了另一个教程,它给了我gui和图像的基本代码。在这里有两个按钮可以切换有效的图像。

    from Tkinter import *
    from random import *
    pathy = randint(1, 2)
    root = Tk()
    prompt = StringVar()
    root.title("vision")
    label = Label(root, fg="dark green")
    label.pack()
    frame = Frame(root,background='red')
    frame.pack()
    canvas = Canvas(height=200,width=200)
    canvas.pack()
    
    def Image1():
        canvas.delete("all")
        image1 = PhotoImage(file = "c2.gif")
        canvas.create_image(0,0,anchor='nw',image=image1)
        canvas.image = image1
    
    def Image2():
        canvas.delete("all")
        image1 = PhotoImage(file = "c1.gif")
        canvas.create_image(0,0,anchor='nw',image=image1)
        canvas.image = image1
    
    TextWindow = Label(frame,anchor = NW, justify = LEFT, bg= 'white', fg   = 'blue', textvariable = prompt, width = 75, height=20)
    TextWindow.pack(side = TOP)
    
    conversationbutton = Button(frame, text='right button',width=25,fg="green",command = Image1)
    conversationbutton.pack(side = RIGHT)
    
    stopbutton = Button(frame, text='left button',width=25,fg="red",command = Image2)
    stopbutton.pack(side = RIGHT)
    
    root.mainloop()
    

1 个答案:

答案 0 :(得分:0)

调用mainloop()函数后,您必须使用回调才能运行自己的代码。 Tkinter after()方法可用于在一段时间后运行一段代码。

在您的情况下,您的代码看起来像:

def update():
    #your code here
    root.after(1000, update)
update()
root.mainloop()

在更新函数内部调用root.after()允许函数继续运行,直到窗口关闭。

effbot中描述的after方法给出的参数为: root.after(milliseconds, callback)

在您的情况下,您可能需要更频繁地每秒调用处理代码。