Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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
Python 如何清除循环中的tkinter标签以及如何在单击另一个按钮时终止循环_Python_Tkinter_Msvcrt - Fatal编程技术网

Python 如何清除循环中的tkinter标签以及如何在单击另一个按钮时终止循环

Python 如何清除循环中的tkinter标签以及如何在单击另一个按钮时终止循环,python,tkinter,msvcrt,Python,Tkinter,Msvcrt,我是PythonTkinter的初学者,我试图在单击各个按钮时打印不同列表中的字符。单击按钮后,每当用户按下键盘上的任何键时,列表中的项目将继续显示。按Enter键后,应停止显示当前列表。 1.画布不会在下一次迭代中清理。将创建新标签并将其放置在旧标签的顶部。我正在分享我得到的输出的图片 我知道方法w.delete('all')但是,使用它之后,我的python崩溃了。有人能建议我如何修改它以完全擦除吗 当按钮1正在循环时,如何在按下按钮2时切换到按钮2的方法。我使用了或操作符,但是我的pyt

我是PythonTkinter的初学者,我试图在单击各个按钮时打印不同列表中的字符。单击按钮后,每当用户按下键盘上的任何键时,列表中的项目将继续显示。按Enter键后,应停止显示当前列表。 1.画布不会在下一次迭代中清理。将创建新标签并将其放置在旧标签的顶部。我正在分享我得到的输出的图片

我知道方法
w.delete('all')
但是,使用它之后,我的python崩溃了。有人能建议我如何修改它以完全擦除吗

  • 当按钮1正在循环时,如何在按下按钮2时切换到按钮2的方法。我使用了
    操作符,但是我的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()