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