Ориентация и организация фреймов Tkinter

Я хотел бы знать, как создавать кадры, которые выравниваются по сетке и заполняют пространство, которое я диктую. Мне трудно понять ориентацию кадра в окне. Я могу сделать все кадры, но если упаковать, то они все слева или в ряд/справа. Я поиграл с этим и остановился на 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()
    ```

пустые строки/столбцы имеют размер 0, поэтому использование column=512 не имеет смысла. Если вам нужно переместить объект, вам, возможно, придется использовать grid_rowconfigure/grid_columnconfigure внутри фреймов - self.frame_left.grid_columnconfigure(0, weight=1)

furas 26.12.2020 01:27

Я не понимаю, какого результата вы ожидаете. Может быть, нарисовать его (в любом графическом редакторе) и добавить к вопросу.

furas 26.12.2020 01:30

Отвечает ли это на ваш вопрос? Как организовать приложение tkinter?

Thingamabobs 26.12.2020 01:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
361
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не знаю, понимаю ли я вашу проблему.

Ваш 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()        

Я вижу, что вы настроили столбцы в каждом из фреймов, я этого не пробовал. Результат, который вы получаете, аналогичен тому, что я получаю, но я хочу, чтобы фрейм данных о погоде был слева, а солнечные данные и новости — справа. Я хотел, чтобы данные о погоде занимали всю половину, а два других складывались и занимали правую половину. Но я продолжаю получать эту гигантскую погодную рамку.

Ungebundene 26.12.2020 02:25

было бы проще, если бы вы нарисовали макет (любой рисовальщик изображений) и поставили вопрос. Но, вероятно, вам нужно создать два столбца - первый для воды, а второй для других элементов - и использовать grid_columnconfigure для обоих - grid_columnconfigure(9, weight=1) grid_columnconfigure(1, weight=1)` и тогда они должны иметь одинаковую ширину.

furas 26.12.2020 02:48

Я помещаю новый пример в ответ

furas 26.12.2020 02:56

Спасибо! Сначала я нарисую «выглядящий» графический интерфейс в Paint, Excel или каком-либо другом инструменте. Я узнал, что сетки для меток находятся внутри рамок и что я неправильно применяю методы «настройки». У меня было неправильное понимание того, как работают столбцы и строки. Теперь я вижу, что вы их создаете и можете размещать в них кадры. (Я думал, что они волшебным образом существуют, и мне просто нужно было указать... неправильно!) Хорошей ночи!

Ungebundene 26.12.2020 05:04

Другие вопросы по теме