2017-02-08 3 views
2

Я построил простой пользовательский интерфейс с помощью tKinter, Python 2.7. Мой код выглядит следующим образом:Создать tKinter-меню с помощью цикла

from Tkinter import * 
import Tkinter, Tkconstants, tkFileDialog, tkMessageBox 

class FileZap(): 
    def __init__(self, root): 
     root.title("Test_App") 
     root.geometry("900x550")   

     self.menu = Menu(root) 
     self.fileMenu = Menu(self.menu) 
     self.funcMenu = Menu(self.menu) 
     self.advMenu = Menu(self.menu) 
     self.toolMenu = Menu(self.menu) 

     root.config(menu=self.menu, width=500, relief=RAISED, borderwidth=2) 

     self.menu.add_cascade(label="File", menu=self.fileMenu) 
     self.menu.add_cascade(label="Functions", menu=self.funcMenu) 
     self.menu.add_cascade(label="Advanced", menu=self.advMenu) 
     self.menu.add_cascade(label="Tools", menu=self.toolMenu) 
     self.menu.add_command(label="Quit", command=root.quit) 

     self.fileMenu.add_command(label="New") 
     self.fileMenu.add_command(label="Open") 
     self.fileMenu.add_command(label="Quit", command=root.quit) 


     self.funcMenu.add_command(label="Properties") 
     self.funcMenu.add_command(label="Properties") 
     self.funcMenu.add_command(label="Properties") 
     self.funcMenu.add('separator') 
     self.funcMenu.add_command(label="Properties") 
     self.funcMenu.add_command(label="Properties")  



root = Tkinter.Tk() 
file_zap = FileZap(root) 
root.mainloop() 

Мне интересно, если я могу генерировать это с более code- специально используя цикл (или несколько петель).

Я попытался объявить список и попытаться итерацию через него для некоторых это, так, например:

menuItems = ['File','Functions','Advanced','Tools','Quit'] 

for item in menuItems: 
    self.menu.add_cascade(label=item, menu=self.fileMenu) 

заменить этот блок:

self.menu.add_cascade(label="File", menu=self.fileMenu) 
self.menu.add_cascade(label="Functions", menu=self.funcMenu) 
self.menu.add_cascade(label="Advanced", menu=self.advMenu) 
self.menu.add_cascade(label="Tools", menu=self.toolMenu) 
self.menu.add_command(label="Quit", command=root.quit) 

, но это не сработало и есть еще что рассмотреть. Я был бы признателен, если бы кто-то мог показать мне лучший способ сделать это, поэтому я могу применить его к остальной части моего пользовательского интерфейса. Я читал, что использование лямбда-функций может быть тем, что мне нужно делать, хотя я еще не уверен, как ...

ответ

2

Вы можете использовать OrderedDict и, как вы сказали, запустить с помощью цикла через словарь и добавить ключ который является меткой и меню, которое является значением.

self.menuItems = OrderedDict([('File',self.fileMenu),('Functions',self.funcMenu),('Advanced',self.advMenu),('Tools', self.toolMenu),('Quit', root.quit)]) 

for k,v in self.menuItems.items(): 
    self.menu.add_cascade(label=k, menu=v) 

Попытайтесь понять, как эти три линии работают и используют свою логику.

for k,v in self.menuItems.items(): 
     self.menu.add_cascade(label=k, menu=v) 

from Tkinter import * 
import Tkinter, Tkconstants, tkFileDialog, tkMessageBox 
from collections import OrderedDict 

class FileZap(): 
    def __init__(self, root): 
     root.title("Test_App") 
     root.geometry("900x550") 
     self.menu = Menu(root) 
     self.fileMenu = Menu(self.menu) 
     self.funcMenu = Menu(self.menu) 
     self.advMenu = Menu(self.menu) 
     self.toolMenu = Menu(self.menu) 

     root.config(menu=self.menu, width=500, relief=RAISED, borderwidth=2) 

     self.menuItems = OrderedDict([('File',self.fileMenu),('Functions',self.funcMenu),('Advanced',self.advMenu),('Tools', self.toolMenu),('Quit', root.quit)]) 

     for k,v in self.menuItems.items(): 
      self.menu.add_cascade(label=k, menu=v) 

     self.commands = ["New", "Open", "Quit"] 

     for comm in self.commands: 
      if comm != "Quit": 
       self.fileMenu.add_command(label=comm) 
      else: 
       self.fileMenu.add_command(label=comm, command=root.quit) 

     for index in range(6): 
      if index != 3: 
       self.funcMenu.add_command(label="Properties") 
      else: 
       self.funcMenu.add('separator') 

root = Tkinter.Tk() 
file_zap = FileZap(root) 
root.mainloop() 
+1

ах это замечательно. Я посмотрел, что вы здесь делаете, и это имеет смысл для меня. Раньше я не встречался с OrderedDict, поэтому что-то новое, чтобы посмотреть там. Спасибо за этот ответ, очень полезно. – JamesPy

Смежные вопросы