无法将一个函数的变量用于tkinter python中的另一个函数

时间:2018-01-17 07:40:22

标签: python tkinter global-variables tkinter-layout

我正在尝试创建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()

1 个答案:

答案 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作为Labellabel_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:Labeltextvariable=,您可以指定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()