Python 如何使用类使用tkinter创建多个类似的帧?
如何在Tkinter中创建具有相同小部件的多个框架?基本上,我想做的是创建一组照片的15个副本,所有这些副本都包含与图中所示相同的小部件,该程序的目的是帮助用户根据用户提供的特定ID将照片分组。单选按钮用于用户对每张照片进行分类,即前、后、上等 将代码复制15次不是很有效,我想知道是否可以使用一个类来定义一次框架,并为每个新框架重用代码。我需要跟踪用户在每个帧上的操作,并将其选择保存在每个帧的单选按钮和复选框上。用户对所有照片进行分类后,单击一个按钮,该按钮应使用新ID保存所有照片,并将单选按钮中的信息保存到csv文件中。然后加载下一批照片并重复该过程 我已经包含了一个用于创建其中一个框架的代码示例,这是我希望使其可重用的代码。我不想重复15次Python 如何使用类使用tkinter创建多个类似的帧?,python,oop,tkinter,Python,Oop,Tkinter,如何在Tkinter中创建具有相同小部件的多个框架?基本上,我想做的是创建一组照片的15个副本,所有这些副本都包含与图中所示相同的小部件,该程序的目的是帮助用户根据用户提供的特定ID将照片分组。单选按钮用于用户对每张照片进行分类,即前、后、上等 将代码复制15次不是很有效,我想知道是否可以使用一个类来定义一次框架,并为每个新框架重用代码。我需要跟踪用户在每个帧上的操作,并将其选择保存在每个帧的单选按钮和复选框上。用户对所有照片进行分类后,单击一个按钮,该按钮应使用新ID保存所有照片,并将单选按钮
############################################################################
#FRAME 3
Photo_2 = Frame(master, bg = "white",relief = RIDGE, bd = 2)
Photo_2.grid(column = 2, row = 1, padx=5, pady=5)
Lbl2 = Label(Photo_2,text = 'Frame 3')
Lbl2.grid(row = 0, column = 0, columnspan = 4, pady = 5)
# Check box
varc2 = StringVar()
varc2.set(0)
Check_2 = Checkbutton(Photo_2, variable = varc2, text="Relevant?", command = lambda:Chk_Val(varc2))
Check_2.grid(row = 1,column = 0,columnspan = 4)
# Photo 1
P2 = "Photo_2.jpg"
P2 = Image.open(P2).resize((200, 200), Image.ANTIALIAS)
phot2 = ImageTk.PhotoImage(P2)
panel = Label(Photo_2, image = phot2)
panel.grid(columnspan = 3, column=1)
# Create Multiple Radio Buttons
Rad_Cont = Frame(Photo_2)
Rad_Cont.grid(column = 0, row = 2)
v2 = StringVar()
v2.set("Address")
for text,mode in RADIO:
b = Radiobutton(Rad_Cont, text=text, variable=v2,
value=mode, command = lambda:Rad_Val(v2))
b.pack()
################################################################################
当然,可以创建一个类来表示类似的对象 以下是我如何实现您试图实现的目标:
import tkinter as tk
class PhotoFrame(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master, bg='white', relief='ridge', bd=2)
self.label_widget()
self.checkbox_widget()
self.photo_widget()
self.radio_widgets()
def label_widget(self):
self.title_label = tk.Frame(self, text='Frame 3') # Or Frame 1, 2 etc.
self.title_label.grid(row=0, column=0, columnspan=4, pady=5)
def checkbox_widget(self):
self.varc = tk.StringVar()
self.varc.set(0)
self.checkbox = tk.Checkbutton(self, variable=self.varc,
text='Relevant?', command=self.Chk_Val)
self.checkbox.grid(row=1, column=0, columnspan=4)
def photo_widget(self):
# ... Your code here
def radio_widgets(self):
# ... Your code here
def Chk_Val(self):
# ... Your code here
现在我试着不给你完整的解决方案,这样你就可以自己学习和解决剩下的问题,但我相信你可以看到我在使用类方面的意图。现在,这个类PhotoFrame可以根据您的喜好多次使用,但请理解,您必须正确配置每个帧,例如,我将省略label_小部件部分中的文本属性分配,您不希望所有帧都命名为“frame 3”,因此在主程序逻辑中,您可以按如下方式配置PhotoFrame对象的每个实例:
frame1 = PhotoFrame(master)
frame1.title_label.configure(text='Frame 1') # Along with any other configuration
我希望这些都能有所帮助-如果您不熟悉类,请查看提供的文档,这里有一个很好的tkinter参考:当然可以创建一个类来表示类似的对象 以下是我如何实现您试图实现的目标:
import tkinter as tk
class PhotoFrame(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master, bg='white', relief='ridge', bd=2)
self.label_widget()
self.checkbox_widget()
self.photo_widget()
self.radio_widgets()
def label_widget(self):
self.title_label = tk.Frame(self, text='Frame 3') # Or Frame 1, 2 etc.
self.title_label.grid(row=0, column=0, columnspan=4, pady=5)
def checkbox_widget(self):
self.varc = tk.StringVar()
self.varc.set(0)
self.checkbox = tk.Checkbutton(self, variable=self.varc,
text='Relevant?', command=self.Chk_Val)
self.checkbox.grid(row=1, column=0, columnspan=4)
def photo_widget(self):
# ... Your code here
def radio_widgets(self):
# ... Your code here
def Chk_Val(self):
# ... Your code here
现在我试着不给你完整的解决方案,这样你就可以自己学习和解决剩下的问题,但我相信你可以看到我在使用类方面的意图。现在,这个类PhotoFrame可以根据您的喜好多次使用,但请理解,您必须正确配置每个帧,例如,我将省略label_小部件部分中的文本属性分配,您不希望所有帧都命名为“frame 3”,因此在主程序逻辑中,您可以按如下方式配置PhotoFrame对象的每个实例:
frame1 = PhotoFrame(master)
frame1.title_label.configure(text='Frame 1') # Along with any other configuration
我希望这些都能有所帮助-如果您不熟悉课程,请查看提供的文档,这里有一个很棒的tkinter参考资料:感谢您的快速回复!这肯定有帮助。我已经创建了一个PhotoFrame类,并在另一个主窗口类中调用它,在该类中我配置了每个帧。再次感谢您,这种方法使代码更具可读性和模块化。你推荐的阅读材料也很有用。我很高兴能帮上忙!感谢您的快速回复!这肯定有帮助。我已经创建了一个PhotoFrame类,并在另一个主窗口类中调用它,在该类中我配置了每个帧。再次感谢您,这种方法使代码更具可读性和模块化。你推荐的阅读材料也很有用。我很高兴能帮上忙!