退出Tkinter下拉菜单

时间:2017-08-13 11:29:41

标签: python python-3.x drop-down-menu tkinter tk

我有一个下拉菜单,希望它必须选择注销。我需要在选择注销时关闭菜单,但我不希望整个程序关闭。

我尝试过像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.

1 个答案:

答案 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()