如何使用类使用tkinter创建多个相似的帧?

时间:2017-07-12 10:08:41

标签: python oop tkinter

如何在Tkinter中创建具有相同小部件的多个帧?基本上我想做的是创建一组multiple frames的15个副本,它们都包含图像中显示的相同小部件,该程序的目的是帮助用户根据特定的方式将照片分组。用户提供的ID。单选按钮供用户对每张照片进行分类,即正面,背面,顶部等。

将代码复制15次并不是非常有效,我想知道是否可以使用类来定义帧一次并为每个新帧重用代码。我需要跟踪用户在每个帧上执行的操作,并将其选择保存在每个帧的单选按钮和复选框上。在用户对所有照片进行分类后,单击一个按钮,然后使用新ID保存所有照片,并将单选按钮中的信息保存到csv文件中。然后加载下一批照片并重复该过程。

我已经包含了一个用于创建其中一个框架的代码示例,这是我想要重用的代码。我不想重复15次。

  ############################################################################
#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()

################################################################################

1 个答案:

答案 0 :(得分:3)

当然可以创建一个表示类似对象的类。

以下是我如何实现您想要实现的目标:

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_widget部分中的文本属性赋值(您不希望所有的帧都标题为'第3帧'),因此在主程序逻辑中,您将配置{{1}的每个实例。像这样的对象:

PhotoFrame

我希望这一切都有帮助 - 如果您不熟悉课程,请查看提供的文档,这里有一个很棒的tkinter参考:NMT tkinter