0

データのセクション内に複数の行を含めることができるテキストを開くようにユーザーに依頼する次のコードがあります。

次に、行ごとに OptionMenu を作成する必要があります。私の問題は、オプションメニューごとに異なることを行い、それを「グリッド」の特定の行にのみ適用する必要があることです。それらをすべて同じ名前で作成していて、別の方法を理解していないため、これを行うことはできません。

with askopenfile(filetypes=[(".txt files","*.txt")], title='Import', mode='r') as f: 
    data_dict=parse_file(f) 


info=data_dict['three'] 
i = 2
for row in info:
    # Create row in 'table' for each output
    no_1, code, value = row             # Obtain results
    def three( code ):
        c = { "1" : "1",
              "2" : "2",
              "3" : "3" }
        try:
            return c[code]
        except KeyError:
            return "None"


    variablelist = StringVar(self.frame_table)
    variablelist.set("Fixed")
    self.list1 = OptionMenu(self.frame_table, variablelist, "Fixed", "List", "Min", "Max", command=self.ChoiceBox)
    self.list1.grid(row=i, column=6, sticky="nsew", padx=1, pady=1)
    i = i + 1

たとえば、3 行目のうち 2 行目の横に追加のボックスを作成したいのですが、3 行目が最後に作成されるため、グリッド情報を取得しようとすると、3 行目にしか追加できません。

このようにした理由は、行の量が常にわかっているとは限らず、オプション メニューを毎回個別に作成するコード行を大量に作成したくなかったからです (たとえ行数を知っていたとしても)。 )。

4

2 に答える 2

0
self.variablelists=[]
self.lists=[]
for row in info:
    # Create row in 'table' for each output
    no_1, code, value = row             # Obtain results
    def three( code ):    #don't know what this is for, but if it's necessary later, this is more clean than your previous code.
        return c if c in "123" else "None"    

    variablelist = StringVar()
    variablelist.set("Fixed")
    self.variablelists.append(variablelist)
    list1 = OptionMenu(self.frame_table, variablelist, "Fixed", "List", "Min", "Max", command=self.ChoiceBox)
    list1.grid(row=i, column=6, sticky="nsew", padx=1, pady=1)
    self.lists.append(list1)
    i += 1

これで、各オプション メニューのハンドルができました。

于 2012-07-10T14:30:06.060 に答える
0

主にあなたの例が意味をなさないため、あなたの質問は非常に不明確です。たとえば、three繰り返しごとに関数を再定義しているのに、一度も使用していないのはなぜですか?

とにかく、次の例が役立つかもしれません。3 つのオプション メニューを作成し、それぞれに変数を関連付け、値が変更されたときにそれぞれが同じプロシージャを呼び出すようにします。デフォルトでは、このメソッドにはオプション メニューの新しい値が与えられます。ラムダ関数を使用して、行番号を関数に渡すこともできます。

import Tkinter as tk

# data for the example
info = (
    ("1.1","1.2","1.3"),
    ("2.1","2.2","2,3"),
    ("3.1","3.2","3.3"),
)

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.status = tk.Label(self, anchor="w")
        self.frame_table = tk.Frame(self, background="black")
        self.frame_table.grid_columnconfigure(1, weight=1)
        self.frame_table.grid_columnconfigure(2, weight=1)
        self.frame_table.grid_columnconfigure(3, weight=1)

        self.status.pack(side="bottom", fill="x")
        self.frame_table.pack(side="top", fill="x", padx=10, pady=10)

        for row_number, row_data in enumerate(info):
            no_1, code, value = row_data
            label = tk.Label(self.frame_table, text="row %d" % row_number, background="gray")
            col1  = tk.Label(self.frame_table, text=no_1)
            col2  = tk.Label(self.frame_table, text=code)
            col3  = tk.Label(self.frame_table, text=value)

            # N.B. 'value' is automatically passed to
            # the command by tkinter; we're adding
            # an extra parameter, 'row' 
            command=lambda value, row=row_number: self.ChoiceBox(value, row)
            stringvar = tk.StringVar(self.frame_table)
            stringvar.set("Fixed")
            option_menu = tk.OptionMenu(self.frame_table, stringvar, 
                                        "Fixed","List","Min","Max", 
                                        command=command)
            label.grid(row=row_number, column=0, sticky="nsew", padx=1, pady=1)
            col1.grid(row=row_number, column=1, sticky="nsew", padx=1, pady=1)
            col2.grid(row=row_number, column=2, sticky="nsew", padx=1, pady=1)
            col3.grid(row=row_number, column=3, sticky="nsew", padx=1, pady=1)
            option_menu.grid(row=row_number, column=6, sticky="nsew", 
                             padx=1, pady=1)

    def ChoiceBox(self, value, row_number):
        self.status.config(text="you set row %d to '%s'" % (row_number, value))

app = SampleApp()
app.mainloop()
于 2012-07-10T14:37:04.763 に答える