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