2017-08-13 73 views
2

我有一个下拉菜单,并希望它不得不选择注销。选择注销时需要关闭菜单,但我不希望整个程序关闭。退出Tkinter下拉菜单

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

根变量函数[范围](http://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.html)只 – SmartManoj

回答

2

与调用function()root.quit()问题是由一个事实,即它是一个局部变量的edit_or_retrieve()功能引起的。这可以通过将其作为参数传递给function()来解决,但不幸的是,OptionMenu小部件就是这样做的,你不能修改它。

但是,您可以解决此通过创建一个短lambda功能充当软件"shim",并传递额外参数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() 
+0

user8435959:这不能解决您的问题吗?如果是这样,请接受它。请参阅[_当有人回答我的问题时该怎么办?_](http://stackoverflow.com/help/someone-answers) – martineau