2013-07-10 20 views
9

Powiedz, że mam menu opcji network_select, które zawiera listę sieci, z którymi można się połączyć.Zmiana opcji w menu Option po naciśnięciu przycisku

import Tkinter as tk 

choices = ('network one', 'network two', 'network three') 
var = tk.StringVar(root) 
network_select = tk.OptionMenu(root, var, *choices) 

Teraz, gdy użytkownik naciśnie przycisk odświeżania, chcę zaktualizować listę sieci, z którymi użytkownik może się połączyć.

  • ja nie mogę używać .config bo przejrzałem network_select.config() i nie widzi wpis, który wyglądał jak wybory dałem.
  • Nie sądzę, że jest to coś, co można zmienić za pomocą zmiennej tk, ponieważ nie ma czegoś takiego jak ListVar.
+0

co czyni go zmienna obiektu? – KingJohnno

Odpowiedz

19

zmodyfikowałem skrypt aby pokazać, jak to zrobić:

import Tkinter as tk 

root = tk.Tk() 
choices = ('network one', 'network two', 'network three') 
var = tk.StringVar(root) 

def refresh(): 
    # Reset var and delete all old options 
    var.set('') 
    network_select['menu'].delete(0, 'end') 

    # Insert list of new options (tk._setit hooks them up to var) 
    new_choices = ('one', 'two', 'three') 
    for choice in new_choices: 
     network_select['menu'].add_command(label=choice, command=tk._setit(var, choice)) 

network_select = tk.OptionMenu(root, var, *choices) 
network_select.grid() 

# I made this quick refresh button to demonstrate 
tk.Button(root, text='Refresh', command=refresh).grid() 

root.mainloop() 

Jak najszybciej kliknij przycisk „Refresh”, opcje w network_select zostaną usunięte i te w new_choices są wstawiane.

+0

Z ciekawości, gdzie jest 'network_select ['menu']'? – charmoniumQ

+0

@Sam: Jest tutaj: network_select.keys() – iCodez

+0

Dzięki! Czy każdy widget Tkintera ma '.keys()'? 'help (network_select ['menu'])' jest tym, czego potrzebowałem! – charmoniumQ

0

To samo, ale z tk.Menu widget:

# Using lambda keyword and refresh function to create a dynamic menu. 
import tkinter as tk 

def show(x): 
    """ Show menu items """ 
    var.set(x) 

def refresh(l): 
    """ Refresh menu contents """ 
    var.set('') 
    menu.delete(0, 'end') 
    for i in l: 
     menu.add_command(label=i, command=lambda x=i: show(x)) 

root = tk.Tk() 
menubar = tk.Menu(root) 
root.configure(menu=menubar) 
menu = tk.Menu(menubar, tearoff=False) 
menubar.add_cascade(label='Choice', menu=menu) 

var = tk.StringVar() 
l = ['one', 'two', 'three'] 
refresh(l) 
l = ['four', 'five', 'six', 'seven'] 
tk.Button(root, text='Refresh', command=lambda: refresh(l)).pack() 
tk.Label(root, textvariable=var).pack() 
root.mainloop()