Есть ли способ создать компонент графического интерфейса в Python Tkinter?

#python #user-interface #tkinter

Вопрос:

Я пишу графический интерфейс на Python с помощью Tkinter, и у меня возникли некоторые трудности. У меня есть этот повторяющийся сегмент:

введите описание изображения здесь

Это повторяется 8 раз.

Я хотел бы создать класс или структуру:

 frame1 = LabelFrame(root, text="Host 0", padx=5, pady=5) frame1.grid(row=0, column=0) labela1 = Label(frame1, text="ID 21") c1 = Checkbutton(frame1, text="Save images") c1.grid(row=2, column=1, columnspan=2) b11 = Button(frame1, text="Start host") b12 = Button(frame1, text="Start app") b13 = Button(frame1, text="Kill app") b14 = Button(frame1, text="Turn off host") labela1.grid(row=1, column=0) b11.grid(row=1, column=2) b12.grid(row=1, column=3) b13.grid(row=1, column=4) b14.grid(row=1, column=5) labela12 = Label(frame1, text="Status", fg='#00f') labela12.grid(row=2, column=3, columnspan=4)  

а затем заполните графический интерфейс через цикл for. Возможно ли это в python? Я действительно не мог найти ничего в Интернете для такого рода проблем. Заранее спасибо!

Комментарии:

1. Создайте новый класс, который наследуется от фрейма (или LabelFrame), и поместите весь свой код в новый класс.

Ответ №1:

Самый распространенный и простой способ создания пользовательского виджета-это начать с создания класса, который наследует от Frame или LabelFrame . Поместите в этот класс все, что захотите. Затем вы можете использовать этот класс, как и любой другой виджет.

 import tkinter as tk  class HostController(tk.LabelFrame):  def __init__(self, parent, hostid, title):  super().__init__(parent, text=title)  self.hostid = hostid   labela1 = tk.Label(self, text=f"ID {hostid}")  c1 = tk.Checkbutton(self, text="Save images")  c1.grid(row=2, column=1, columnspan=2)   b11 = tk.Button(self, text="Start host")  b12 = tk.Button(self, text="Start app")  b13 = tk.Button(self, text="Kill app")  b14 = tk.Button(self, text="Turn off host")   labela1.grid(row=1, column=0)  b11.grid(row=1, column=2)  b12.grid(row=1, column=3)  b13.grid(row=1, column=4)  b14.grid(row=1, column=5)   labela12 = tk.Label(self, text="Status", fg='#00f')  labela12.grid(row=2, column=3, columnspan=4)  root = tk.Tk() for i in range(5):  hc = HostController(root, hostid=i, title=f"Host {i}")  hc.pack(side="top", padx=4, pady=(0,4))  root.mainloop()  

скриншот

Комментарии:

1. Спасибо вам большое, добрый человек. Хорошего дня! lt;3