Tkinter GUI で一連のサブフレームを作成しようとしています。各サブフレームには、後で各サブフレームの一意の ID を介して取得できるようにする必要があるいくつかのユーザー入力変数が含まれています。サブフレームを自由に追加および削除し、適切な順序で ID を付けられるようにする必要があります (現時点では、整数は 1 からカウントアップします)。
本当に3つの質問:
1) 具体的には、各フレームのタイトルを表示するラベル ウィジェットが表示されないのはなぜですか? (これはおそらくばかげたことです...)
2) 特に、フレームを追加または削除するのに追加または削除ボタンを 2 回押す必要があるのはなぜですか?
3)一般的に:これにアプローチするより良い方法はありますか?フレームインスタンスを追跡するという意味で。それらは今リストにあります...私は以前に口述で始めましたが、それを扱うのは難しかったです...より良い提案はありますか?
from tkinter import *
from tkinter.ttk import *
class AllInstances(Tk):
def __init__(self):
Tk.__init__(self)
self.master_frame = Frame(self)
self.master_frame.grid()
self.all_instances = []
root = AllInstances()
class OneInstance():
def __init__(self):
self.number = len(root.all_instances) + 1
var1 = StringVar()
var2 = StringVar()
var3 = StringVar()
self.sub_frame = Frame(root.master_frame)
self.sub_frame.grid(column = self.number, row = 0)
titletext = StringVar()
titletext.set('%s %s' % ('Frame', self.number))
print(titletext.get())
title = Label(self.sub_frame, textvariable = titletext)
title.grid() #work out why this label does not display!
uservar1 = Entry(self.sub_frame, textvariable = var1)
uservar1.grid()
uservar2 = Entry(self.sub_frame, textvariable = var2)
uservar2.grid()
uservar3 = Entry(self.sub_frame, textvariable = var3)
uservar3.grid()
#etc etc
add_button = Button(self.sub_frame, text = 'Add', command = lambda: Create())
add_button.grid()
def RemoveInstance(self):
if len(root.all_instances) > 1:
root.all_instances.remove(self)
self.sub_frame.destroy()
for instance in root.all_instances:
instance.number = (root.all_instances.index(instance) + 1)
else:
pass
remove_button = Button(self.sub_frame, text = 'Remove', command = lambda: RemoveInstance(self))
remove_button.grid()
root.all_instances.append(self)
def Create():
OneInstance()
Create()
root.mainloop()
ありがとう... :)