Не удалось добавить виджеты во фрейм

#python #tkinter

Вопрос:

Приведенный ниже код работает так, как и ожидалось.

 import tkinter as tk from tkinter import *   windowBackgroundColor = "#333333" cardColor = "#000000" textColor = "#ffffff"   class SystemInfoView():  def __init__(self, root):  self.root = root   def initializeView(self):  self.frameSystemInfo = tk.Frame(self.root, bg=cardColor)  self.frameSystemInfo.grid(column=0, row=0, rowspan=2, sticky="NSEW", padx=5, pady=5)   # self.frameSystemInfo.columnconfigure(0, weight=1)   # self.frameSystemInfo.rowconfigure(0, weight=1)  # self.frameSystemInfo.rowconfigure(1, weight=1)   # labelSystemTime = tk.Label(self.frameSystemInfo, text="System Time:")  # labelSystemTime.grid(column=0, row=0, sticky="NSE")   # entrySystemTime = tk.Entry(self.frameSystemInfo, font=("Helvetica", 14))  # entrySystemTime.grid(column=0, row=1, sticky="NSE")   class App(tk.Tk):  def __init__(self):  super().__init__()  self.title("My Title")  self.configure(bg=windowBackgroundColor)   self.columnconfigure(0, weight=1)  self.columnconfigure(1, weight=1)  self.columnconfigure(2, weight=1)  self.columnconfigure(3, weight=1)   self.rowconfigure(0, weight=1)  self.rowconfigure(1, weight=1)  self.rowconfigure(2, weight=1)   self.systemInfoView = SystemInfoView(self)  self.systemInfoView.initializeView()   rectangle_2 = tk.Frame(self, bg="#000000")  rectangle_2.grid(column=1, row=0, sticky="NSEW", padx=5, pady=5)   rectangle_3 = tk.Frame(self, bg="#000000")  rectangle_3.grid(column=2, row=0, sticky="NSEW", padx=5, pady=5)   rectangle_4 = tk.Frame(self, bg="#000000")  rectangle_4.grid(column=3, row=0, sticky="NSEW", padx=5, pady=5)     app = App() app.mainloop()  

Когда я запускаю скрипт, я могу получить результат ниже.

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

Я хочу сделать что-то вроде приведенного ниже. введите описание изображения здесь

Метка вверху, запись под меткой, кнопка 3 рядом под записью, они должны быть внутри frameSystemInfo рамки.

Когда я раскомментирую коды внутри initializeView функции, все ломается.

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

Что я должен делать?

Ответ №1:

Вам просто нужно разместить виджеты там, где вы хотите их видеть. В закомментированном коде вы добавляете виджеты только в пару строк, и ваше использование sticky не соответствует желаемому результату.

Ваше второе изображение подразумевает по крайней мере 5 строк, причем 5-я строка пуста и занимает все неиспользуемое пространство в нижней части кадра. Вам также, похоже, нужны 4 колонки. Ваша метка находится в первой строке, а ваша запись-во второй, обе они охватывают все столбцы.

Для начала вам, вероятно, нужно только убедиться, что все столбцы имеют одинаковую ширину, что вы можете сделать с помощью этой uniform опции. Что касается строк, я предполагаю, что вам нужна только последняя пустая строка, чтобы получить все дополнительное пространство, поэтому она должна быть единственной строкой с ненулевым weight значением . Это заставит все остальные строки быть вверху.

 self.frameSystemInfo.columnconfigure((0,1,2,3), uniform="equal", weight=1) self.frameSystemInfo.rowconfigure(4, weight=1)  

Далее, нужно просто поместить метку в первую строку, а запись во вторую, и чтобы они охватывали все столбцы в этом кадре. Им нужно держаться по бокам своей камеры, чтобы использовать все отведенное им пространство.

 labelSystemTime.grid(column=0, row=0, columnspan=4, sticky="nsew") entrySystemTime.grid(column=0, row=1, columnspan=4, sticky="nsew")