0

テキストファイルのインポートに続いてウィジェットを繰り返すことでTkinterにテーブルを作成しました(したがって、含まれている情報に応じて新しい行が作成されます)。

次の画像は、OptionMenuの選択に応じて、列「7」以降に入力ボックスの個別の領域を作成できる必要があることを示しています。

テーブル

オプションリストの場合、ユーザーは入力する入力ボックスの数を尋ねられます(したがって、「n」ボックスが作成されます)。'Fixed'値の場合、削除される前にボックスやボックスがないはずです。OptionMenuの他の2つのオプションには、常に最小値と最大値(2ボックス)があります。これらのボックスの各値は、ユーザーからの入力に続いて収集する必要があります。

私は以前、毎回新しいフレームを作成する可能性について助けてくれましたが、可能であれば同じフレームを使用したいと思います。私は選択のために次のコードを持っています:

if choice == "Fixed":

    for i in xrange(self.number_boxes):

        self.box[i].grid_remove()
        self.choice_title.grid_remove()
        self.frame_table.grid_columnconfigure(7, weight=0)
    tkMessageBox.showinfo("Message", "Value fixed.")
elif choice == "List":
    self.win2 = tk.Toplevel(self.root)
    self.win2.title("List")
    self.list_text = Label(self.win2, text="Please enter number of values to be used:")
    self.list_text.grid(row=0, column=0, sticky="nsew", padx=1, pady=1)
    self.value = StringVar()
    self.list_values = Entry(self.win2, textvariable=self.value, justify="center")
    self.list_values.grid(row=1, column=1, sticky="nsew", padx=1, pady=1)

    list_button = ttk.Button(self.win2, text="Enter", command=self.ValueBox)
    list_button.grid(row=2, column=1, sticky="nsew", padx=1, pady=1)
    self.win2.mainloop()

    column = 7
    self.number_boxes = int(self.number_boxes)
    self.numbers = [StringVar() for i in xrange(self.number_boxes) ]  
    self.box = []

    for i in xrange(self.number_boxes):
        self.clicked.append(False)
        self.choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0, width=10) 
        self.choice_title.grid(row=1, column=self.column, columnspan=self.number_boxes, sticky="nsew", padx=1, pady=1) 
        self.box.append(Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", textvariable=self.numbers[i], fg='grey'))
        self.box[i].grid(row=self.row_list,column=self.column+i, sticky='nsew', padx=1, pady=1) 
        self.box[i].insert(0, "Value %g" % float(i+1))
        self.box[i].bind("<Button-1>", lambda event : self.callback(event))

        self.total_boxes = self.number_boxes * ( rows - 2 )
        self.boxes=[]
        self.boxes.append(self.box[i])

        tkMessageBox.showinfo("Message", "Please fill in list values.")

    for i in self.numbers: 
        i.trace('w',lambda : self.numberwritten() ) 

    elif choice == "Min" or "Max":

        self.numbers = [StringVar() for i in xrange(2) ] #Name available in global scope. 
        self.number_boxes = 2
        self.box = []
        for i in xrange(2): 
            self.clicked.append(False)
            self.choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0)
            self.choice_title.grid(row=1, column=self.column, columnspan=2, sticky="nsew", padx=1, pady=1)
            self.box.append(Entry(self.frame_table,bg='white',borderwidth=0,textvariable=self.numbers[i], justify='center', fg='grey'))
            self.box[i].grid(row=self.row_list, column=self.column+i, sticky='nsew', padx=1, pady=1) 
        if i == 0:
            self.box[0].insert(0, "Min value")
        elif i == 1:
            self.box[1].insert(0, "Max value")
            self.box[i].bind("<Button-1>", lambda event : self.callback(event))
            self.boxes=[]
            self.boxes.append(self.box[i])

        tkMessageBox.showinfo("Message", "Enter Min/Max values.")

        for i in self.numbers: 
            i.trace('w',lambda a,b,n=i: self.numberwritten(n) ) 

UPDATEセクション

def numberwritten(self): # where the above code block is usually all indented differently in comparision to this.
    self.numbers.get()

def callback(self, event, index):

    if (self.clicked[index] == False):
        self.box[index].delete(0, END)
        self.box[index].config(fg='black')
        self.clicked[index] = True

この質問にコードをぶつけたくはありませんが、numberwrittenなどの他の関数が必要な場合は、それらを提供できます。終わりに近づいていますが、「最後の仕上げ」に苦労しているので、助けていただければ幸いです。

4

1 に答える 1

0

次のループには、怪しいことがいくつかあります(怪しい場所にコメントを追加します)。

for i in xrange(self.number_boxes):
    self.clicked.append(False)
    self.choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0, width=10)  #Fishy
    self.choice_title.grid(row=1, column=self.column, columnspan=self.number_boxes, sticky="nsew", padx=1, pady=1) 
    self.box.append(Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", textvariable=self.numbers[i], fg='grey'))
    self.box[i].grid(row=self.row_list,column=self.column+i, sticky='nsew', padx=1, pady=1) 
    self.box[i].insert(0, "Value %g" % float(i+1))
    self.box[i].bind("<Button-1>", lambda event, index=i : self.callback(event, index))

    self.total_boxes = self.number_boxes * ( rows - 2 ) #fishy
    self.boxes=[] #fishy
    self.boxes.append(self.box[i])

    tkMessageBox.showinfo("Message", "Please fill in list values.") #fishy

まず、choice_titleラベルを作成していますが、作成しているラベルの1つへの参照のみを保持しています。おそらく、それをリストに変更して、ボックスリストの場合と同じように追加する必要があります。

第二にself.total_boxes、ループを通過するたびに計算する必要はありません。最後に計算できます(私は思います)。

第三self.boxes=[]に、ループの前に移動する必要があります。あなたがしていることは self.boxes=[self.box[i]]、ループのすべてのステップで次のことと同等です。完了すると、ボックスリストに1つのボックス(最後のボックス)しかありません。

第4に、ループを繰り返すたびにメッセージボックスをユーザーに表示します。それは本当にあなたが望むものですか?それともインデントエラーですか?

ここには少し奇妙なものがもっとあるかもしれませんが、これらはあなたに始める場所を与えてくれます。これが私がそれがどのように見えるべきだと思うかです:

self.box=[]
self.boxes=[]
self.choice_title=[]
for i in xrange(self.number_boxes):
    self.clicked.append(False)
    choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0, width=10)  #Fishy
    choice_title.grid(row=1, column=self.column, columnspan=self.number_boxes, sticky="nsew", padx=1, pady=1)
    self.choice_title.append(choice_title)
    box=Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", textvariable=self.numbers[i], fg='grey')
    self.box.append(box)
    box.grid(row=self.row_list,column=self.column+i, sticky='nsew', padx=1, pady=1) 
    box.insert(0, "Value %g" % float(i+1))
    box.bind("<Button-1>", lambda event, index=i : self.callback(event, index))

    self.boxes.append(box)  #This is still a little weird since self.box and self.boxes are essentially the same information.

self.total_boxes = self.number_boxes * ( rows - 2 ) #fishy
tkMessageBox.showinfo("Message", "Please fill in list values.") 
于 2012-07-10T13:06:52.993 に答える