0

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

1 回答 1

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_selectedLabellabel_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()

顺便说一句: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()
于 2018-01-17T14:01:37.500 回答