【发布时间】:2019-04-08 23:42:07
【问题描述】:
目标是在 TkInter 中实现不同的“屏幕”并在它们之间进行切换。最容易想到的就是一个移动应用程序,点击图标,例如“添加新”,然后打开新屏幕。该应用程序共有 7 个屏幕,它应该能够根据用户操作更改屏幕。
安装在 Raspberry Pi 上,连接了 LCD+触摸屏。我在 Python3 中使用 tkinter。画布用于在屏幕上显示元素。 由于我来自嵌入式硬件世界并且在 Python 和一般高级语言方面的经验很少,因此我使用 switch-case 逻辑来解决这个问题。在 Python 中,这是 if-elif-elif ...
我尝试了各种方法:
- 制作全局画布对象。有一个变量 programState 确定当前显示哪个屏幕。这显然不起作用,因为它只会运行一次并卡在下面的主循环中。
from tkinter import *
import time
root = Tk()
programState = 0
canvas = Canvas(width=320, height=480, bg='black')
canvas.pack(expand=YES, fill=BOTH)
if(programState == 0):
backgroundImage = PhotoImage(file="image.gif")
canvas.create_image(0,0, image=backgroundImage, anchor=NW);
time.sleep(2)
canvas.delete(ALL) #delete all objects from canvas
programState = 1
elif(programState == 1):
....
....
....
root.mainloop()
使用 root.after 函数,但这失败了并且不会在屏幕上显示任何内容,它只会创建画布。我可能没有在正确的地方使用它。
尝试创建另一个线程来更改屏幕,只是为了测试线程选项。它卡在第一个图像上,永远不会移动到第二个图像。
from tkinter import *
from threading import Thread
from time import sleep
def threadFun():
while True:
backgroundImage = PhotoImage(file="image1.gif")
backgroundImage2 = PhotoImage(file="image2.gif")
canvas.create_image(0,0,image=backgroundImage, anchor=NW)
sleep(2)
canvas.delete(ALL)
canvas.create_image(0,0,image=backgroundImage2, anchor=NW)
root = Tk()
canvas = Canvas(width=320, height=480, bg='black')
canvas.pack(expand=YES, fill=BOTH)
# daemon=True kills the thread when you close the GUI, otherwise it would continue to run and raise an error.
Thread(target=threadFun, daemon=True).start()
root.mainloop()
我希望这个应用程序可以使用一个特殊线程来更改屏幕,该线程会调用一个函数来重绘画布上的元素,但到目前为止这一直失败。据我所知,线程可能是最好的选择。它们最接近我的无限循环思维方式(当真),也最接近我的逻辑。
这里有什么选择?如何实现删除整个屏幕并重新绘制(我称之为制作新“屏幕”)?
【问题讨论】:
-
在打开窗口之前执行
mainloop之前的所有操作。mainloop启动窗口并运行直到您关闭窗口。当窗口打开时,您必须使用按钮或after执行功能 - 然后它可以更改窗口中的元素。 -
如果您想像在移动应用程序中使用按钮更改屏幕,然后创建按钮并将功能分配给按钮
Button(..., command=function_name)。使用threads会产生一些问题,因为只有主线程才能更改 GUI 中的元素。如果您不使用按钮并且必须延迟更改屏幕,使用after可能是更好的方法。 -
您可以创建两个具有不同元素的画布和
pack()/unpack()canvas,而不是更改画布中的元素。 -
很久以前在 Stackoverflow 上是如何使用
Frame创建几个页面并在主窗口中替换它们的示例。 -
我个人不建议初学者使用该示例。太多的人在不了解的情况下复制并使用它,这导致更多的混乱。 :-\
标签: python tkinter tkinter-canvas