【问题标题】:How do I create multiple similar frames with tkinter using classes?如何使用 tkinter 使用类创建多个相似的框架?
【发布时间】:2017-12-16 16:55:22
【问题描述】:

如何在 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()

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

【问题讨论】:

    标签: python oop tkinter


    【解决方案1】:

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

    以下是我可能会如何实现您想要完成的任务:

    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 帧”),因此在您的主程序逻辑中,您将配置 PhotoFrame 对象的每个实例像这样:

    frame1 = PhotoFrame(master)
    frame1.title_label.configure(text='Frame 1')  # Along with any other configuration
    

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

    【讨论】:

    • 感谢您的快速响应!这肯定有帮助。我设法创建了一个 PhotoFrame 类,并在我配置每个框架的另一个主窗口类中调用它。这种方法使代码更具可读性和模块化,再次感谢。您推荐的阅读材料也很有用。
    • 很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多