Python tkinter重写小部件

Python tkinter重写小部件,python,tkinter,Python,Tkinter,我无法理解update()方法。当我使用[widget].update()时,我认为小部件应该重新创建自己(或者如果我使用root.update()则root中的所有小部件都重新创建自己)。 但我的程序没有做到这一点。重新创建小部件的最简单方法是什么?很明显,我可以在标签和其他东西上使用configure,但它在OptionMenus上不起作用,对吗?那么如何重新创建Optionmenus之类的小部件呢 from tkinter import * def f1(): menu = me

我无法理解update()方法。当我使用[widget].update()时,我认为小部件应该重新创建自己(或者如果我使用root.update()则root中的所有小部件都重新创建自己)。 但我的程序没有做到这一点。重新创建小部件的最简单方法是什么?很明显,我可以在标签和其他东西上使用configure,但它在OptionMenus上不起作用,对吗?那么如何重新创建Optionmenus之类的小部件呢

from tkinter import *

def f1():
    menu = menu = OptionMenu(root, var, "hello", "hi", "hey")
    menu.update() # or root.update()

root = Tk()

var = StringVar()
var.set("hello")
menu = OptionMenu(root, var, "hello", "hi")
menu.pack()

button = Button(root, text="button", command=f1)
button.pack()

root.mainloop()


您必须删除所有选项,然后重新添加旧选项和新选项

from tkinter import *
import tkinter as tk
root = Tk()

def f1():
    var.set('hello')
    menu['menu'].delete(0, 'end')

    options = ("hello", "hi", "hey")
    for i in options:
        menu['menu'].add_command(label=i, command=tk._setit(var, i))

var = StringVar()
var.set("hello")
menu = OptionMenu(root, var, "hello", "hi")
menu.pack()

button = Button(root, text="button", command= f1)
button.pack()

root.mainloop()

您必须删除所有选项,然后重新添加旧选项和新选项

from tkinter import *
import tkinter as tk
root = Tk()

def f1():
    var.set('hello')
    menu['menu'].delete(0, 'end')

    options = ("hello", "hi", "hey")
    for i in options:
        menu['menu'].add_command(label=i, command=tk._setit(var, i))

var = StringVar()
var.set("hello")
menu = OptionMenu(root, var, "hello", "hi")
menu.pack()

button = Button(root, text="button", command= f1)
button.pack()

root.mainloop()
当我使用[widget].update()时,我想到了小部件应该重新创建自己

不,那根本不是
update
所做的

Tkinter应用程序(以及使用任何工具箱编写的任何GUI)依赖于稳定的事件流—鼠标单击、按钮单击、鼠标移动、从操作系统请求重画等。这些事件由操作系统放置在队列中,tkinter使用
mainloop
一个接一个地处理这些事件

update
只是请求
mainloop
提取所有未决事件并处理它们。它独立于任何特定的小部件

那么如何重新创建Optionmenus之类的小部件呢

from tkinter import *

def f1():
    menu = menu = OptionMenu(root, var, "hello", "hi", "hey")
    menu.update() # or root.update()

root = Tk()

var = StringVar()
var.set("hello")
menu = OptionMenu(root, var, "hello", "hi")
menu.pack()

button = Button(root, text="button", command=f1)
button.pack()

root.mainloop()

如果您想重新创建一个小部件,那么销毁和重新创建小部件取决于您的代码。该过程与最初创建时相同

下面是一个以问题中的代码开始的示例:

def f1():
    global menu
    menu.destroy()
    menu = OptionMenu(root, var, "hello", "hi", "hey")
    menu.pack(before=button)
这意味着您必须提前计划,以确保很容易重新创建小部件
pack
使这一点更加困难,因为默认情况下,它按调用
pack
的顺序放置东西。在上面的示例中,代码使用
before
选项确保新菜单位于按钮之前

当我使用[widget].update()时,我想到了小部件应该重新创建自己

不,那根本不是
update
所做的

Tkinter应用程序(以及使用任何工具箱编写的任何GUI)依赖于稳定的事件流—鼠标单击、按钮单击、鼠标移动、从操作系统请求重画等。这些事件由操作系统放置在队列中,tkinter使用
mainloop
一个接一个地处理这些事件

update
只是请求
mainloop
提取所有未决事件并处理它们。它独立于任何特定的小部件

那么如何重新创建Optionmenus之类的小部件呢

from tkinter import *

def f1():
    menu = menu = OptionMenu(root, var, "hello", "hi", "hey")
    menu.update() # or root.update()

root = Tk()

var = StringVar()
var.set("hello")
menu = OptionMenu(root, var, "hello", "hi")
menu.pack()

button = Button(root, text="button", command=f1)
button.pack()

root.mainloop()

如果您想重新创建一个小部件,那么销毁和重新创建小部件取决于您的代码。该过程与最初创建时相同

下面是一个以问题中的代码开始的示例:

def f1():
    global menu
    menu.destroy()
    menu = OptionMenu(root, var, "hello", "hi", "hey")
    menu.pack(before=button)

这意味着您必须提前计划,以确保很容易重新创建小部件
pack
使这一点更加困难,因为默认情况下,它按调用
pack
的顺序放置东西。在上面的示例中,代码使用
before
选项确保新菜单位于按钮之前。

您实际希望它做什么?您正确理解更新的作用,但在您的函数中,您正在创建一个新的变量菜单,它是一个新的OptionMenu小部件,您没有将其打包到根目录中。此外,即使您在将新小部件放入变量中与更改变量中的内容不一样,因此之前已经执行了
global menu
,您也可以销毁该小部件并将其放置到位,但它无法与pack一起正常工作。@FlavioMoraes:no,对
update
的理解是完全错误的。此外,“它不能与pack一起正常工作”的说法也不正确
pack
可以使用,您只需了解
pack
如何工作以及如何使用它的所有选项。您实际希望它做什么?您正确地了解更新的功能,但在您的函数中,您正在创建一个新的变量菜单,它是一个新的OptionMenu小部件,并且您没有将它打包到根目录中。此外,即使您在将新小部件放入变量中与更改变量中的内容不一样,因此之前已经执行了
global menu
,您也可以销毁该小部件并将其放置到位,但它无法与pack一起正常工作。@FlavioMoraes:no,对
update
的理解是完全错误的。此外,“它不能与pack一起正常工作”的说法也不正确<可以使用code>pack,您只需了解
pack
的工作原理以及如何使用其所有选项即可。