Используя сетку, как сделать так, чтобы кадры не сдвигали друг друга с места? - PullRequest
0 голосов
/ 24 августа 2018

Работал над этой проблемой более суток.

Я бы хотел, чтобы мои верхние рамки были прямо на картинке.

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

Я знаю, что здесь есть исправления, но я еще не думаю о том, как заставить это работать.

The way I would like, top frames to remain

How the next section pushes top frame.

Если возможно, не могли бы вы использовать КЛАССЫ или многие необычные ФУНКЦИИ. Честно говоря, на данный момент я слаб в них на данный момент. Заранее благодарим за то, что нашли время прочитать и за любую предложенную помощь.

from tkinter import *

import os
import PIL.Image
import random
import sys
import tkinter as tk

global logo
global po

# path to image file
home = os.path.expanduser('~')
dt = desktop_top = os.path.join(home,'Desktop')
p3p = python_3_projects = os.path.join(dt,'Python 3 Projects')
ilfru = images_labeled_for_reuse = os.path.join(p3p,'Images Labeled for Reuse')
gp = gurps_path = os.path.join(ilfru,'GURPS')
gg = gurps_gif = os.path.join(gp,'GIF')

fc = 1
# Count number of file in GURPS/GIF folder
for root, dirs, files in os.walk(gg):
    for filenames in files:
        fc +=1

# Pick a random number based off number of files
rn = random.randint(1,fc)

# Cycle through files and assign the random file to logo
fc = 1
# Count number of file in GURPS/GIF folder
for root, dirs, files in os.walk(gg):
    for filenames in files:
        if fc == rn:
            logo = os.path.join(gg,filenames)
        fc +=1

# Get Image Size
# po PIL Open
po = open(logo,"rb")
img = PIL.Image.open(po)

# Image Width, Image Height
iw,ih = img.size

ih = ih + 5

root = tk.Tk()

# Round Down Nearest tenth
def rd(num,divisor):
    x = (num/divisor)-(num%divisor)
    x = int(x)
    return x

# Get Screen Dimensions
sh = screen_height = root.winfo_screenheight()
sw = screen_width = root.winfo_screenwidth()

# Window size
rg = str(sw)+'x'+str(sh)
root.geometry(rg)

# Create all frames
nwfh = rd(sh, 10)
nwfw = rd(sw, 4)

equal_sides = nwfh + nwfw
equal_sides = rd(equal_sides,4)

ntf = rd(sw-equal_sides,1)

# Frames

spacer_width = rd(equal_sides,10)

frame0 = Frame(root,bg='black',width=sw,height=sh,padx=5,pady=5)
frame0.grid(row=0,column=0)

north_west_top_frame = Frame(frame0, bg='cyan', width=equal_sides, height=equal_sides)

frame_spacer0 = Frame(frame0, bg='beige', width=spacer_width, height=ih)

northern_top_frame = Frame(frame0,bg='alice blue', width=ntf,height=ih,padx=15,pady=15)

# Layout all frames

# Trying configure
# northern_top_frame.grid_columnconfigure(1,weight=1)


# Frame Section 1
north_west_top_frame.grid(row=0,column=0, sticky="nw")

frame_spacer0.grid(row=0, column=1, sticky="w")

northern_top_frame.grid(row=0,column=2)


# Put logo in nw frame
glogo = tk.PhotoImage(file=logo)
gurps_logo = tk.Label(north_west_top_frame, compound = tk.CENTER, text='GURPS\nCHARACTER\nSHEET',fg = "red", font="Helvetica 10 bold", image=glogo).grid(row=0,column=0)

l1 = tk.Label(northern_top_frame, anchor='w', text="Name: ", font = "Helvetica 10 bold",width=17)
l1.grid(row=0, column=0)
e1 = Entry(northern_top_frame)
e1.grid(row=0,column=1)

# Spacer Width = pic prame width -
# ih is northern frame height
# need label height

spacer_height = ih-30

# spacer
# s1 = Frame(northern_top_frame,bg='firebrick', width=ntf,height=spacer_height)
# s1.grid(row=1,column=1, columnspan=11, sticky=tk.W+tk.E)


l4 = tk.Label(northern_top_frame, anchor='w', text="Ht: ", font = "Helvetica 10 bold", width=17)
l4.grid(row=2, column=0)
e4 = Entry(northern_top_frame)
e4.grid(row=2,column=1)



l9 = tk.Label(northern_top_frame, anchor='w', text="Appearance: ", font = "Helvetica 10 bold", width=17)
l9.grid(row=4, column=0)
e9 = Entry(northern_top_frame)
e9.grid(row=4,column=1, columnspan=11, sticky=tk.W+tk.E)

# Section 2
s2 = Frame(frame0,bg='firebrick', width=ntf)
s2.grid(row=5,column=0, sticky="w")


l10 = tk.Label(s2, text="LEVEL")
l10.grid(row=6,column=1)


root.mainloop()

1 Ответ

0 голосов
/ 24 августа 2018

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

Пример минимальной полной проверки для этого может быть простым:

from tkinter import *

root = Tk()

frame0 = Frame(root, bg='black', width=500, height=300, padx=5, pady=5)
frame0.grid(row=0, column=0)


north_west_top_frame = Frame(frame0, bg='cyan', width=150, height=150)
frame_spacer0 = Frame(frame0, bg='beige', width=50, height=150)
northern_top_frame = Frame(frame0, bg='alice blue', width=300, height=150)

north_west_top_frame.grid(row=0, column=0, sticky="nw")
frame_spacer0.grid(row=0, column=1, sticky="w")
northern_top_frame.grid(row=0, column=2)


s2 = Frame(frame0, bg='firebrick', width=500, height=150)
s2.grid(row=5, column=0, sticky="w")

root.mainloop()

Проблема в том, как выопределить сетку.Вы ставите north_west_top_frame и s2 в столбец 0, самый левый столбец.Вы ставите frame_spacer0 на один столбец справа и northern_top_frame на один столбец дальше.Каждый столбец растягивается, чтобы вместить все, что вы в него вставили, поэтому первый столбец (столбец 0) имеет ширину s2.Следующий столбец с бежевой рамкой находится рядом с первым столбцом, поэтому он начинается там, где заканчивается красная рамка.

То, что вам нужно, это то, что красная рамка находится не только в столбце 0, нотакже в колонках 1 и 2 под бежевой и белой рамками.Для этого используйте columnspan:

s2.grid(row=5, column=0, columnspan=3, sticky="w")

Когда вы сделаете это, вы увидите, что красная рамка охватывает всю рамку голубого, бежевого и белого цветов:

...