2013-07-10 5 views
9

Скажем, у меня есть меню опций network_select, в котором есть список сетей для подключения.Изменение параметров OptionMenu при нажатии кнопки

import Tkinter as tk 

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

Теперь, когда пользователь нажимает кнопку обновления, я хочу, чтобы обновить список сетей, которые пользователь может подключиться.

  • Я не могу использовать .config потому что я просмотрел network_select.config() и не видел запись, которая была похожа на выборы, которые я дал его.
  • Я не думаю, что это то, что можно изменить с помощью переменной tk, потому что нет такой вещи, как ListVar.
+0

насчет делает его объектную переменную? – KingJohnno

ответ

19

Я изменил сценарий, чтобы показать, как это сделать:

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

Как только вы нажмете на кнопку «Обновить», опции в network_select очищаются и те, в new_choices вставлены.

+0

Из любопытства, где находится 'network_select ['menu']'? – charmoniumQ

+0

@Sam: Он находится здесь: network_select.keys() – iCodez

+0

Спасибо! У каждого виджета Tkinter есть '.keys()'? 'help (network_select ['menu'])' это то, что мне нужно! – charmoniumQ

0

То же самое, но с tk.Menu виджете:

# 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() 
Смежные вопросы