Я хотел бы знать, как создавать кадры, которые выравниваются по сетке и заполняют пространство, которое я диктую. Мне трудно понять ориентацию кадра в окне. Я могу сделать все кадры, но если упаковать, то они все слева или в ряд/справа. Я поиграл с этим и остановился на grid(). Я задаю геометрию окна, а затем использую сетку для фреймов. Однако все мои кадры схлопываются в верхний левый угол или мой начальный кадр заполняет все пространство, а два других сжимаются по краям. Я попытался использовать геометрию окна 1024 и 768, затем выделить ширину и высоту для моего первого кадра 512 и 384. Затем установить для следующих двух ширину 512 и высоту 192. Я также видел в других статьях, что вес важен и пробовал итерации кода, чтобы изменить это, но безуспешно. Rowspan и columnspan помогли мне получить цвета фона, чтобы я мог визуализировать пространство, занимаемое каждым из них.
Во всяком случае, код ниже:
class twinsplay:
def __init__(self):
#Window
self.window = Tk()
self.window.geometry('1024x768')
self.window.grid_rowconfigure(1, weight=1)
self.window.grid_columnconfigure(1, weight=1)
#window title
self.window.title('Live Feed')
#frames and labels
self.frame_left = Frame(self.window, background='magenta')
self.frame_left.grid(row=0, column=0, padx=5, pady=5, rowspan=3, columnspan=3, sticky=NSEW)
self.label_left = Label(self.frame_left, text = 'Weather Data', justify=LEFT)
self.label_left.grid(row=0,column=0, sticky=NSEW)
self.frame_tr = Frame(self.window, background='green')
self.frame_tr.grid(row=0, column=3, padx=5, pady=5, rowspan=3, columnspan=2, sticky=NSEW)
self.label_tr = Label(self.frame_tr, text = 'Solar Data', justify = RIGHT)
self.label_tr.grid(row=0, column=512, sticky=NSEW)
self.frame_br = Frame(self.window, background='yellow')
self.frame_br.grid(padx=5, pady=5, rowspan=2, columnspan=2, sticky=NSEW)
self.label_br = Label(self.frame_br, text = 'News', justify = RIGHT)
self.label_br.grid(row=0, column=512, sticky=NSEW)
#main
self.window.mainloop()
```
Я не понимаю, какого результата вы ожидаете. Может быть, нарисовать его (в любом графическом редакторе) и добавить к вопросу.
Отвечает ли это на ваш вопрос? Как организовать приложение tkinter?






Не знаю, понимаю ли я вашу проблему.
Ваш frames использует полный размер внутри window, но элементы внутри frames свернуты. Возможно, вам придется использовать grid_rowconfigure/grid_columnconfigure также с frame_left, frame_tr, frame_br, чтобы изменить размер элементов в сетке внутри frames.
Я перемещаю элементы по строкам и столбцам 0, потому что пустые строки/столбцы не имеют размера и нет смысла помещать в столбец 512
from tkinter import *
class twinsplay:
def __init__(self):
self.window = Tk()
self.window.geometry('1024x768')
self.window.grid_rowconfigure(0, weight=1)
self.window.grid_columnconfigure(0, weight=1)
#window title
self.window.title('Live Feed')
#frames and labels
self.frame_left = Frame(self.window, background='magenta')
self.frame_left.grid(row=0, column=0, padx=5, pady=5, sticky=NSEW)
self.label_left = Label(self.frame_left, text = 'Weather Data', justify=LEFT, bg='red')
self.label_left.grid(row=0,column=0, sticky=NSEW)
self.frame_left.grid_rowconfigure(0, weight=1)
self.frame_left.grid_columnconfigure(0, weight=1)
# ---
self.frame_tr = Frame(self.window, background='green')
self.frame_tr.grid(row=0, column=1, padx=5, pady=5, sticky=NSEW)
self.label_tr = Label(self.frame_tr, text = 'Solar Data', justify = RIGHT, bg='green')
self.label_tr.grid(row=0, column=0, sticky=NSEW)
self.frame_tr.grid_rowconfigure(0, weight=1)
self.frame_tr.grid_columnconfigure(0, weight=1)
# ---
self.frame_br = Frame(self.window, background='yellow')
self.frame_br.grid(row=1, column=0, padx=5, pady=5, columnspan=2, sticky=NSEW)
self.label_br = Label(self.frame_br, text = 'News', justify = RIGHT, bg='yellow')
self.label_br.grid(row=0, column=0, sticky=NSEW)
self.frame_br.grid_rowconfigure(0, weight=1)
self.frame_br.grid_columnconfigure(0, weight=1)
#main
self.window.mainloop()
twinsplay()
Но если вы попытаетесь сделать что-то другое, возможно, вам придется использовать grid_rowconfigure/grid_columnconfigure с другими строками/столбцами — вы можете использовать его много раз с разными строками/столбцами.
Обновлено:
from tkinter import *
class twinsplay:
def __init__(self):
self.window = Tk()
self.window.geometry('1024x768')
# left and right column will use the same size
self.window.grid_columnconfigure(0, weight=1)
self.window.grid_columnconfigure(1, weight=1)
# top and bottom rows will use the same size
self.window.grid_rowconfigure(0, weight=1)
self.window.grid_rowconfigure(1, weight=1)
#window title
self.window.title('Live Feed')
#frames and labels
# frame will use 2 rows
self.frame_left = Frame(self.window, background='magenta')
self.frame_left.grid(row=0, column=0, padx=5, pady=5, sticky=NSEW, rowspan=2)
self.label_left = Label(self.frame_left, text = 'Weather Data', justify=LEFT, bg='red')
self.label_left.grid(row=0,column=0, sticky=NSEW)
self.frame_left.grid_rowconfigure(0, weight=1)
self.frame_left.grid_columnconfigure(0, weight=1)
# ---
self.frame_tr = Frame(self.window, background='green')
self.frame_tr.grid(row=0, column=1, padx=5, pady=5, sticky=NSEW)
self.label_tr = Label(self.frame_tr, text = 'Solar Data', justify = RIGHT, bg='green')
self.label_tr.grid(row=0, column=0, sticky=NSEW)
self.frame_tr.grid_rowconfigure(0, weight=1)
self.frame_tr.grid_columnconfigure(0, weight=1)
# ---
self.frame_br = Frame(self.window, background='yellow')
self.frame_br.grid(row=1, column=1, padx=5, pady=5, columnspan=2, sticky=NSEW)
self.label_br = Label(self.frame_br, text = 'News', justify = RIGHT, bg='yellow')
self.label_br.grid(row=0, column=0, sticky=NSEW)
self.frame_br.grid_rowconfigure(0, weight=1)
self.frame_br.grid_columnconfigure(0, weight=1)
#main
self.window.mainloop()
twinsplay()
Я вижу, что вы настроили столбцы в каждом из фреймов, я этого не пробовал. Результат, который вы получаете, аналогичен тому, что я получаю, но я хочу, чтобы фрейм данных о погоде был слева, а солнечные данные и новости — справа. Я хотел, чтобы данные о погоде занимали всю половину, а два других складывались и занимали правую половину. Но я продолжаю получать эту гигантскую погодную рамку.
было бы проще, если бы вы нарисовали макет (любой рисовальщик изображений) и поставили вопрос. Но, вероятно, вам нужно создать два столбца - первый для воды, а второй для других элементов - и использовать grid_columnconfigure для обоих - grid_columnconfigure(9, weight=1) grid_columnconfigure(1, weight=1)` и тогда они должны иметь одинаковую ширину.
Я помещаю новый пример в ответ
Спасибо! Сначала я нарисую «выглядящий» графический интерфейс в Paint, Excel или каком-либо другом инструменте. Я узнал, что сетки для меток находятся внутри рамок и что я неправильно применяю методы «настройки». У меня было неправильное понимание того, как работают столбцы и строки. Теперь я вижу, что вы их создаете и можете размещать в них кадры. (Я думал, что они волшебным образом существуют, и мне просто нужно было указать... неправильно!) Хорошей ночи!
пустые строки/столбцы имеют размер
0, поэтому использованиеcolumn=512не имеет смысла. Если вам нужно переместить объект, вам, возможно, придется использоватьgrid_rowconfigure/grid_columnconfigureвнутри фреймов -self.frame_left.grid_columnconfigure(0, weight=1)