Когда я запускаю приведенный ниже код, я не получаю сообщение об ошибке, но нижняя рамка не появляется в окне, пожалуйста, вы можете сказать мне, почему и как я могу ее отобразить (используя метод pack NOT GRID, пожалуйста). Я использую Python 3.5.0

import tkinter 
from tkinter import *
root = tkinter.Tk()
root.geometry("1920x1080")
TopFrame = Frame(root, width=1920, height=200, bg= "green")
TopFrame.pack(side=TOP)
MiddleRightFrame = Frame(root, width=1120, height=730, bg="orange")
MiddleRightFrame.pack(side=RIGHT)
MiddleLeftFrame = Frame(root, width=800, height=730, bg="black")
MiddleLeftFrame.pack(side=LEFT)
BottomFrame = Frame(root, width=1920, height=150, bg="blue")
BottomFrame.pack(side=BOTTOM)
0
Fake 3 Мар 2018 в 21:20

3 ответа

Лучший ответ

Я думаю, что проблема заключается в том, что вы используете стороны пакета, так что в середине нет линии ничего. Один из способов обойти это - создать MiddleFrame, где используются стороны упаковки, а затем просто упаковать другие кадры.

import tkinter 
from tkinter import *

root = tkinter.Tk()
root.geometry("1920x1080")

TopFrame = Frame(root, width=1920, height=200, bg= "green")
TopFrame.pack()

#the middle frame
MiddleFrame = Frame(root)

#pack the two middle frames into the frame created above
#the parent of the two middle frames change to become MiddleFrame instead of root
MiddleRightFrame = Frame(MiddleFrame, width=1120, height=730, bg="orange")
MiddleRightFrame.pack(side=RIGHT)

MiddleLeftFrame = Frame(MiddleFrame, width=800, height=730, bg="black")
MiddleLeftFrame.pack(side=RIGHT)

#pack the middle frame with both frames inside it
MiddleFrame.pack()

BottomFrame = Frame(root, width=1920, height=150, bg="blue")
BottomFrame.pack()
0
Crawley 3 Мар 2018 в 18:41

Ваш MiddleLeftFrame имеет ширину 800 пикселей. Ваш MiddleRightFrame составляет 1120 пикселей. 1120 + 800 = 1920. Вы устанавливаете окно шириной всего 1920 пикселей, поэтому для синей рамки нет места.

Удалите эту строку, и ваш кадр появится: root.geometry("1920x1080")

Если ваше намерение состоит в том, чтобы оно появилось в нижней части окна, охватывая всю ширину окна, затем вызовите pack для него, прежде чем вызывать pack слева и справа.

Кроме того, я настоятельно рекомендую группировать ваши pack заявления вместе. Это облегчает управление кодом в моем опыте (и у меня много опыта!).

import tkinter 
from tkinter import *
root = tkinter.Tk()
root.geometry("1920x1080")

TopFrame = Frame(root, width=1920, height=200, bg= "green")
MiddleRightFrame = Frame(root, width=1120, height=730, bg="orange")
MiddleLeftFrame = Frame(root, width=800, height=730, bg="black")
BottomFrame = Frame(root, width=1920, height=150, bg="blue")

TopFrame.pack(side=TOP)
BottomFrame.pack(side=BOTTOM)
MiddleRightFrame.pack(side=RIGHT)
MiddleLeftFrame.pack(side=LEFT)

root.mainloop()

Причина этого работает из-за алгоритма упаковщика. Когда вы размещаете что-то слева или справа, оно выделяет все оставшееся вертикальное пространство на этой стороне. Таким образом, после того, как вы упакуете что-то слева и справа, а затем упакуете что-то внизу, «низ» - это нижняя часть пространства между левым и правым, а не нижняя часть окна в целом.

Вот каноническое описание того, как pack работает:

http://tcl.tk/man/tcl8.5/TkCmd/pack.htm#M26

1
Bryan Oakley 3 Мар 2018 в 21:25

Добавлять:

tkinter.mainloop()

Так что графический интерфейс начинает ждать событий, а не пропускать, чтобы закрыть себя.


Кроме того, pack использует алгоритм заполнения, который вычисляет динамически, чтобы заполнить пустое пространство. Вы не должны делать это так, но в данном конкретном случае достаточно простого обмена вызовами. Вызов:

BottomFrame.pack(side=BOTTOM)

точно после TopFrame пакета:

TopFrame.pack(side=TOP)
BottomFrame.pack(side=BOTTOM)
MiddleRightFrame.pack(side=RIGHT)
MiddleLeftFrame.pack(side=LEFT)
0
Nae 3 Мар 2018 в 18:43