2017-02-08 28 views
2

私は、tKinter、Python 2.7を使って簡単なUIを構築しました。私は、具体的ループ(または複数のループ)のために使用して、より良いコード - でこれを生成することができる場合、私は疑問に思ってforループで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() 

:私のコードは次のようになります。

私は、例えば、リストを宣言し、このいくつかのためにそれを反復処理しようとすると、してみました:

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) 

が、これがうまくいきませんでした考えなければならないことはたくさんあります。誰かが私にこれを行うためのより良い方法を示すことができたら、私は感謝するでしょう、私はそれを私のUIの残りの部分に適用するかもしれません。私はラムダ関数を使用して私は何をする必要があるかもしれないことを読んだが、再び私はよく分からないが...

答えて

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) 

これら3つのラインがどのように機能し、ロジックを使用しているかを理解してください。

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

関連する問題