#python #class #tkinter #label #multiple-entries
#python #класс #tkinter #метка #несколько записей
Вопрос:
Я учусь кодировать программу с графическим интерфейсом, но я не могу разобраться с лучшим принципом.
На данный момент я пытаюсь получить 5 записей, и текст, который будет записан в записи, будет автоматически обновляться до меток. Вот мой код на данный момент:
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
# GUI starts here
self.label = tk.Label(parent, text="Give values")
self.label.grid(row="1")
self.entries()
self.labels()
def entries(self):
for i in range(5):
number1 = tk.StringVar()
entry = tk.Entry(textvariable=number1)
entry.grid(row=3, column=i)
result = entry.get()
return result
def labels(self,):
for i in range(5):
label = tk.Label(self.parent, text=self.entries(), width=17, borderwidth=2, relief="groove")
label.grid(row=4, column=i)
if __name__ == "__main__":
root = tk.Tk()
root.geometry("1280x800")
MainApplication(root).grid()
root.mainloop()
Вывод моего кода следующий. По-видимому, многое неправильно, потому что я не получаю пять полей ввода, и они не обновляются до меток ниже автоматически.
У меня два вопроса:
- Как исправить мой код, чтобы получить желаемый результат
- Было бы лучшим способом создать графический интерфейс с использованием вложенных классов внутри моего класса MainApplication вместо методов.
Комментарии:
1. Ваш вызов
entries()
при первоначальном вызове класса, что означает, что внутри записей еще нет данных, и они остаются пустыми. Я думаю, что лучший способ здесь — использовать,trace()
дляStringVar()
. И да, может быть лучший способ сделать это.2. Если вы уверены, что у вас всего 5 полей ввода, просто создайте 5 полей вместо того, чтобы перебирать их.
3. Я пытаюсь сделать программу легко масштабируемой, и мне не кажется, что если я вручную создам новое поле ввода.
4. Если вы перебираете его, единственное решение, которое я могу придумать, — это «рекурсия».
Ответ №1:
Если вы хотите, чтобы надписи имели точно такой же текст, что и виджеты ввода, самым простым решением на сегодняшний день является то, чтобы они имели одинаковый textvariable
общий доступ.
Вот простой пример. Когда вы запускаете его, а затем вводите в любую запись, значение сразу отображается в метке под ним.
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self,parent, *args, **kwargs)
self.parent = parent
self.label = tk.Label(parent, text="Give values")
self.label.grid(row=1)
for column in range(5):
var = tk.StringVar()
entry = tk.Entry(root, textvariable=var)
label = tk.Label(root, textvariable=var, width=17)
entry.grid(row=2, column=column, sticky="ew")
label.grid(row=3, column=column, sticky="ew")
if __name__ == "__main__":
root = tk.Tk()
root.geometry("1280x800")
MainApplication(root).grid()
root.mainloop()
Обычно я не выступаю за использование специальных переменных tkinter для Entry
виджетов, но это хороший пример того, когда это правильный инструмент для работы.
Что касается вопроса об использовании вложенных классов, нет, они не помогут. Почти никогда не бывает времени, когда вложенные классы лучше, чем определение классов в глобальной области видимости. Вложенность делает код более сложным для написания и понимания, обеспечивая при этом очень мало дополнительной ценности.
Вложенные классы могут быть полезны в очень специфических случаях, но обычно их не следует использовать.
Комментарии:
1. ДА. Это было больше похоже на решение, о котором я думал.