你有两个问题:
第一:mainloop()
启动窗口,所以pri()
在你看到窗口之前执行你的 - 所以在你可以选择任何东西之前。我添加pri
到按钮,因此您还可以在选择选项后查看它的工作原理。
第二:所有在函数/类之外创建的变量都是全局的,它们不需要关键字global
。您必须使用global
内部函数来通知函数,当您将使用分配值时,您将=
使用外部/全局变量而不是创建本地变量。
在代码中,我有全局变量normal_var
,我global normal_var
在内部使用grab_and_assign
来通知函数将值分配给全局变量,而不是在行中创建局部变量
normal_var = var.get()
我不必在global
内部使用,pri()
因为我只从变量nromal_var
中获取值而不用于=
分配新值
我不必使用global
为以下内容分配新值:
var
因为它使用set()
而不是=
.
label_selected["text"]
因为它为字典中的键赋值。
但是如果我想分配新的global
内部功能,我将不得不使用- 即。label_selected
Label
label_selected = tk.Label(..)
import tkinter as tk
# --- functions ---
def grab_and_assign(event):
global normal_var
normal_var = var.get()
label_selected["text"] = var.get()
def pri():
print('normal_var:', normal_var)
print('var.get():', var.get())
print('---')
# --- main ---
# global variable
normal_var = "- empty -"
root = tk.Tk()
root.title("Drop-down boxes for option selections.")
# it is global variable
var = tk.StringVar(root)
var.set("drop down menu button")
drop_menu = tk.OptionMenu(root, var, "one", "two", "three", "four", "meerkat", "12345", "6789", command=grab_and_assign)
drop_menu.grid(row=0, column=0)
label_left = tk.Label(root, text="chosen variable = ")
label_left.grid(row=1, column=0)
# create it only once
label_selected = tk.Label(root, text="?")
label_selected.grid(row=1, column=1)
# execute `pri` after button press
b = tk.Button(root, text='PRI', command=pri)
b.grid(row=2, column=0)
# execute `pri` before window starts
pri()
root.mainloop()
顺便说一句:Label
有textvariable=
,你可以分配var
你使用的OptionMenu
,然后它会自动显示选定的值
import tkinter as tk
# --- main ---
root = tk.Tk()
var = tk.StringVar(root)
var.set("drop down menu button")
label_selected = tk.Label(root, textvariable=var)
label_selected.pack()
drop_menu = tk.OptionMenu(root, var, "one", "two", "three", "four", "meerkat", "12345", "6789")
drop_menu.pack()
root.mainloop()