Python 如何清除循环中的tkinter标签以及如何在单击另一个按钮时终止循环
我是PythonTkinter的初学者,我试图在单击各个按钮时打印不同列表中的字符。单击按钮后,每当用户按下键盘上的任何键时,列表中的项目将继续显示。按Enter键后,应停止显示当前列表。 1.画布不会在下一次迭代中清理。将创建新标签并将其放置在旧标签的顶部。我正在分享我得到的输出的图片 我知道方法Python 如何清除循环中的tkinter标签以及如何在单击另一个按钮时终止循环,python,tkinter,msvcrt,Python,Tkinter,Msvcrt,我是PythonTkinter的初学者,我试图在单击各个按钮时打印不同列表中的字符。单击按钮后,每当用户按下键盘上的任何键时,列表中的项目将继续显示。按Enter键后,应停止显示当前列表。 1.画布不会在下一次迭代中清理。将创建新标签并将其放置在旧标签的顶部。我正在分享我得到的输出的图片 我知道方法w.delete('all')但是,使用它之后,我的python崩溃了。有人能建议我如何修改它以完全擦除吗 当按钮1正在循环时,如何在按下按钮2时切换到按钮2的方法。我使用了或操作符,但是我的pyt
w.delete('all')
但是,使用它之后,我的python崩溃了。有人能建议我如何修改它以完全擦除吗
或操作符,但是我的python崩溃了。现在,我只能按enter键退出。如果我再按一个按钮,python就会崩溃。
我能知道我的python崩溃的原因吗
将tkinter作为tk导入
导入msvcrt
随机输入
root=tk.tk()
myCanvas=tk.Canvas(根,宽度=500,高度=200)
myCanvas.pack()
w=tk.Canvas(根,宽=500,高=200)
w、 位置(relx=0.5,rely=0.1)
def打印_2():
flag2=1
name_list=['Mia Jennete Moi','cara','juili','meera','ed']
input1=msvcrt.getwch()
label2=tk.Label(根,字体=('Courier',15))
w、 创建窗口(60,40,窗口=标签2)
如果旗手1=1或输入1!='\r':
label2.config(text=random.choice(name_list))
根.后(10,打印_2)
def打印_1():
flag1=1
name_list=['Rui Sagar','Nana Kana','Mike','Bob','Drake']
input1=msvcrt.getwch()
如果flag2=1或输入1!='\r':
label2=tk.Label(根,文本=random.choice(名称列表),字体=('Courier',15))
w、 创建窗口(60,40,窗口=标签2)
root.after(10,打印_1)
flag1=0
flag2=0
B1=tk.按钮(root,text=“Option 1”,font=('Courier',12),command=printing_1)
myCanvas.create_窗口(40,30,窗口=B1)
B2=tk.Button(root,text=“Option 2”,font=('Courier',12),command=printing_2)
myCanvas.create_窗口(40,80,窗口=B2)
root.mainloop()
您应该在开始时创建空标签,以后只更改现有标签中的文本
label2.config(text=random.choice(name_list))
或
当您按下按钮时,您可以运行函数来更改值flag1
和flag2
(一组True
,另一组False
),然后运行函数,该函数将使用after()运行循环
您必须使用global
来设置外部变量。如果没有global
,您将创建局部变量
您可以使用更可读的名称running_1
,running_2
而不是flag1
,flag2
,并使用值True/False
而不是0/1
您可以使用root.bind(“,stop)
来运行函数stop()
,该函数将设置running\u 1=False
和running\u 2=False
来停止所有循环
最小工作代码
顺便说一句:我在after()
中使用500
来减速,并查看它显示的值
import tkinter as tk
import random
# --- functions
def printing_1():
global running_1
global running_2
global name_list
running_1 = True
running_2 = False # stop other list
name_list = ['Rui Sagar' , 'Nana Kana', 'Mike', 'Bob', 'Drake']
print("start list 1")
update_1()
def update_1():
if running_1:
label["text"] = random.choice(name_list)
root.after(500, update_1)
def printing_2():
global running_1
global running_2
global name_list
running_1 = False # stop other list
running_2 = True
name_list = ['Mia Jennete Moi' , 'cara', 'juili', 'meera', 'ed']
print("start list 2")
update_2()
def update_2():
if running_2:
label["text"] = random.choice(name_list)
root.after(500, update_2)
def stop(event):
global running_1
global running_2
running_1 = False
running_2 = False
print('stoped')
# --- main ---
running_1 = False
running_2 = False
name_list = None
root = tk.Tk()
root.bind('<Return>', stop)
canvas = tk.Canvas(root, width=500, height=200)
canvas.pack()
w = tk.Canvas(root, width=500, height=200)
w.place(relx=0.5, rely=0.1)
label = tk.Label(root)
w.create_window(60, 40, window=label)
button1 = tk.Button(root, text="Option 1", command=printing_1)
canvas.create_window(40, 30, window=button1)
button2 = tk.Button(root, text="Option 2", command=printing_2)
canvas.create_window(40, 80, window=button2)
root.mainloop()
编辑:
如果只想在按键时更新标签,则不需要msvcrt
和after
,只需bind(“”,函数名称)
将tkinter作为tk导入
随机输入
#---功能
def打印_1():
“”“分配新列表并更新标签”“”
全局名称列表
name_list=['Rui Sagar','Nana Kana','Mike','Bob','Drake']
#在开始时设置值
更新_标签()
def打印_2():
“”“分配新列表并更新标签”“”
全局名称列表
name_list=['Mia Jennete Moi','cara','juili','meera','ed']
#在开始时设置值
更新_标签()
def on_键(事件):
“”“如果列表已分配给`name\u列表,则更新标签”`
按下的键与“Return”不同
如果名称列表和event.keysym!='返回':
更新_标签()
def更新_标签():
标签[“文本”]=随机选择(名称列表)
#---梅因---
name\u list=None
root=tk.tk()
root.bind(“”,on#键)#按任意键时运行函数
canvas=tk.canvas(根,宽度=500,高度=200)
canvas.pack()
w=tk.Canvas(根,宽=500,高=200)
w、 位置(relx=0.5,rely=0.1)
label=tk.label(根)
w、 创建窗口(60,40,窗口=标签)
button1=tk.Button(root,text=“Option 1”,command=printing_1)
canvas.create_窗口(40,30,窗口=按钮1)
button2=tk.Button(root,text=“Option 2”,command=printing_2)
canvas.create_窗口(40,80,窗口=按钮2)
root.mainloop()
要更改文本,请使用标签[“文本”]=“新文本”
。如果要将新文本添加到现有文本标签[“text”]=label[“text”]+“new text”
中,请始终将完整的错误消息(从单词“Traceback”开始)作为文本(而不是屏幕截图)放在问题中(不是注释)。还有其他有用的信息。顺便说一句:可能在flag1
和flag2
中使用True/False
而不是0/1
,这样会更具可读性。您可以使用更可读的名称,而不是flag1
,flag2
可能在开始时创建空标签,然后只更改此标签中的文本-并且不创建新标签。可能在运行printing_1
时,然后设置flag1=1
,以及flag2=0
以停止打印_2
,谢谢。现在,它的标签工作良好。我很抱歉,因为我忘了提到我的代码要求在键盘上按下任何键(enter键除外)时显示列表中的项目。这就是我保留msvcrt.getwch()函数的原因。然而,如果我使用它,tkinter正在崩溃。是否还有其他方法来执行此操作?我会做必要的更新
import tkinter as tk
import random
# --- functions
def printing_1():
global running_1
global running_2
global name_list
running_1 = True
running_2 = False # stop other list
name_list = ['Rui Sagar' , 'Nana Kana', 'Mike', 'Bob', 'Drake']
print("start list 1")
update_1()
def update_1():
if running_1:
label["text"] = random.choice(name_list)
root.after(500, update_1)
def printing_2():
global running_1
global running_2
global name_list
running_1 = False # stop other list
running_2 = True
name_list = ['Mia Jennete Moi' , 'cara', 'juili', 'meera', 'ed']
print("start list 2")
update_2()
def update_2():
if running_2:
label["text"] = random.choice(name_list)
root.after(500, update_2)
def stop(event):
global running_1
global running_2
running_1 = False
running_2 = False
print('stoped')
# --- main ---
running_1 = False
running_2 = False
name_list = None
root = tk.Tk()
root.bind('<Return>', stop)
canvas = tk.Canvas(root, width=500, height=200)
canvas.pack()
w = tk.Canvas(root, width=500, height=200)
w.place(relx=0.5, rely=0.1)
label = tk.Label(root)
w.create_window(60, 40, window=label)
button1 = tk.Button(root, text="Option 1", command=printing_1)
canvas.create_window(40, 30, window=button1)
button2 = tk.Button(root, text="Option 2", command=printing_2)
canvas.create_window(40, 80, window=button2)
root.mainloop()
import tkinter as tk
import random
# --- functions
def printing_1():
global name_list
global running
name_list = ['Rui Sagar' , 'Nana Kana', 'Mike', 'Bob', 'Drake']
if not running:
running = True
update_label()
def printing_2():
global name_list
global running
name_list = ['Mia Jennete Moi' , 'cara', 'juili', 'meera', 'ed']
if not running:
running = True
update_label()
def update_label():
if running:
label["text"] = random.choice(name_list)
root.after(500, update_label)
def stop(event):
global running
running = False
print('stoped')
# --- main ---
name_list = None
running = False
root = tk.Tk()
root.bind('<Return>', stop)
canvas = tk.Canvas(root, width=500, height=200)
canvas.pack()
w = tk.Canvas(root, width=500, height=200)
w.place(relx=0.5, rely=0.1)
label = tk.Label(root)
w.create_window(60, 40, window=label)
button1 = tk.Button(root, text="Option 1", command=printing_1)
canvas.create_window(40, 30, window=button1)
button2 = tk.Button(root, text="Option 2", command=printing_2)
canvas.create_window(40, 80, window=button2)
root.mainloop()
import tkinter as tk
import random
# --- functions
def printing_1():
"""Assign new list and update label"""
global name_list
name_list = ['Rui Sagar' , 'Nana Kana', 'Mike', 'Bob', 'Drake']
# set value at start
update_label()
def printing_2():
"""Assign new list and update label"""
global name_list
name_list = ['Mia Jennete Moi' , 'cara', 'juili', 'meera', 'ed']
# set value at start
update_label()
def on_key(event):
"""Update label if list is assigned to `name_list`
and pressed key is different then `Return`"""
if name_list and event.keysym != 'Return':
update_label()
def update_label():
label["text"] = random.choice(name_list)
# --- main ---
name_list = None
root = tk.Tk()
root.bind('<Key>', on_key) # run function when pressed any key
canvas = tk.Canvas(root, width=500, height=200)
canvas.pack()
w = tk.Canvas(root, width=500, height=200)
w.place(relx=0.5, rely=0.1)
label = tk.Label(root)
w.create_window(60, 40, window=label)
button1 = tk.Button(root, text="Option 1", command=printing_1)
canvas.create_window(40, 30, window=button1)
button2 = tk.Button(root, text="Option 2", command=printing_2)
canvas.create_window(40, 80, window=button2)
root.mainloop()