我正在尝试创建GUI,我无法在tkinter中的其他函数的一个函数中使用变量的值
但是,在正常函数中,当我们将变量声明为全局变量时,它是可访问的。
这是我的代码,
from tkinter import *
global chosen_option
root = Tk()
root.title("Drop-down boxes for option selections.")
var = StringVar(root)
var.set("drop down menu button")
def grab_and_assign(event):
grab_and_assign.var = var.get()
label_chosen_variable= Label(root, text=chosen_option)
label_chosen_variable.grid(row=1, column=2)
print(chosen_option)
def pri():
print(grab_and_assign.chosen_option)
drop_menu = OptionMenu(root, var, "one", "two", "three", "four", "meerkat", "12345", "6789", command=grab_and_assign)
drop_menu.grid(row=0, column=0)
label_left=Label(root, text="chosen variable= ")
label_left.grid(row=1, column=0)
pri()
root.mainloop()
答案 0 :(得分:1)
你有两个问题:
首先: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()
BTW: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()