我有一个下拉菜单,希望它必须选择注销。我需要在选择注销时关闭菜单,但我不希望整个程序关闭。
我尝试过像root.quit()这样的方法,但它说root没有定义,即使它是。关闭菜单的最佳方法是什么?菜单的代码是:
from tkinter import *
def edit_or_retrieve():
root = Tk()
root.title("Main Menu")
menu = Frame(root)
menu.pack(pady = 5, padx = 50)
var = StringVar(root)
options = [
'Enter',
'Edit',
'Retrieve',
'Report 1 - Dates of birth',
'Report 2 - Home phone numbers',
'Report 3 - Home addresses',
'Log off',
]
option = OptionMenu(menu, var, options[0], *options, command=function)
var.set('Select')
option.grid(row = 1, column = 1)
root.mainloop()
def function(value):
if value == 'Edit':
edit()
if value == 'Enter':
enter()
if value == 'Retrieve':
display()
if value == 'Report 1 - Dates of birth':
reportone()
if value == 'Report 2 - Home phone numbers':
reporttwo()
if value == 'Report 3 - Home addresses':
reportthree()
if value == 'Log off':
#this is where the command or function name needs to go,
#however I am not sure what it should be.
答案 0 :(得分:2)
root.quit()
中调用function()
的问题是因为它是edit_or_retrieve()
函数的本地变量。这可以通过将其作为参数传递给function()
来修复,但不幸的是,OptionMenu
小部件就是这样做的,你无法修改它。
但是,您可以通过创建一个充当软件"shim"的简短lambda
函数并在时将额外参数传递给function()
来解决此问题并将额外参数传递给该函数。它的被叫了。
以下是您的代码,其中包含修改内容:
from tkinter import *
def edit_or_retrieve():
root = Tk()
root.title("Main Menu")
menu = Frame(root)
menu.pack(pady=5, padx=50)
var = StringVar(root)
options = ['Enter',
'Edit',
'Retrieve',
'Report 1 - Dates of birth',
'Report 2 - Home phone numbers',
'Report 3 - Home addresses',
'Log off',]
option = OptionMenu(menu, var, *options,
# use lambda to pass local var as extra argument
command=lambda x: function(x, root))
var.set('Select')
option.grid(row=1, column=1)
root.mainloop()
def function(value, root): # note added "root" argument
if value == 'Edit':
edit()
if value == 'Enter':
enter()
if value == 'Retrieve':
display()
if value == 'Report 1 - Dates of birth':
reportone()
if value == 'Report 2 - Home phone numbers':
reporttwo()
if value == 'Report 3 - Home addresses':
reportthree()
if value == 'Log off':
root.quit()
edit_or_retrieve()