Python - Tkinter исправляет положение объекта - PullRequest
0 голосов
/ 08 мая 2018

В настоящее время я тестирую с помощью Python GUI и создал скрипт, который берет 2 введенных числа из 2 текстовых полей и при нажатии кнопки генерирует блок меток (например, я ввожу 4 и 5, поэтому он генерирует поле меток 4x5)

но теперь я хочу сделать это: когда я генерирую объекты, я хочу, чтобы они не - переехать - перекрытие мои текущие объекты (кнопки, текстовые поля). Я могу что-то придумать для перекрытия, но каждый раз, когда я создаю новые вещи, все движется вокруг. Могу ли я установить определенное поле в сетке, чтобы оно было «зарезервировано», чтобы новое содержимое никогда не появлялось там?

это моя текущая попытка - как вы можете видеть, она больше не перекрывается, но если генерируются снежинки, текстовые поля и кнопки все еще "прыгают" на небольшом расстоянии

РЕДАКТИРОВАТЬ: "скачки" происходят из-за размера шрифта добавленных снежинок - это все еще оставляет мой вопрос о том, как я это предотвращаю, так как я не хочу ограничиваться маленькими размерами шрифта

from tkinter import *
wide = 0
deep = 0
entrytext = "test"
window = Tk()
window.title("test")
window.geometry('1000x1000')


ent = Entry(window)
ent.grid(column=0, row=1)

def GetClicked():
    global wide
    wide = ent.get()
    wide = int(wide)

btn2 = Button(window, text="Width", command=GetClicked)
btn2.grid(column=0, row=2)

ent2 = Entry(window)
ent2.grid(column=0, row=3)

def GetClicked2():
    global deep
    deep = ent2.get()
    deep = int(deep)

btn = Button(window, text="Depth", command=GetClicked2)
btn.grid(column=0, row=4)

def WingBut(column,row):
    lbl = Label(window, text="T", font=("Wingdings", 15))
    lbl.grid(column=column, row=row)
def clicked(wide,deep):
    h = 0
    j = 0
    while h in range (deep):
        i = 0
        h += 1
        while i in range(wide):
             if i > 2 or j > 5:
                 WingBut(i,j)
             i += 1
             if i == wide:
                 j += 1


btn = Button(window, text="Buttonspam",font=("Arial", 10),command=lambda: clicked(wide,deep))
btn.grid(column=0, row=0)






window.mainloop()

1 Ответ

0 голосов
/ 08 мая 2018

текстовые поля и кнопки все еще "прыгают" на небольшом расстоянии

Это связано с тем, что результирующий размер динамически добавляемых меток (помеченных буквой «T») выше текущей высоты строки для каждой строки. Поскольку размер строки должен увеличиваться для размещения новой метки, размеры других виджетов в той же строке также изменяются, так что общая высота строки остается неизменной. Это изменение размера вызывает эффект прыжка.

Один из способов исправить это - уменьшить размер шрифта надписей "T". Попробуйте установить его на 10, и проблема должна исчезнуть.

Другим способом решения этой проблемы является установка minsize для каждой строки равной высоте самого высокого виджета в строке, например, высота виджета с надписью "T".

for row in range(5):
    window.rowconfigure(row, minsize=36)

Вы можете добавить вышеуказанный код, прежде чем позвонить window.mainloop().

Я выбрал 36, потому что это делает строки минимум 36 пикселей в высоту, и этого достаточно в моей системе, чтобы отобразить «T», не вызывая изменение размера строки.

Если вы не хотите жестко кодировать minsize, вы можете рассчитать его динамически.

dummy = Label(window, text="T", font=("Wingdings", 20))
dummy.grid(row=0, column=0)
dummy.update_idletasks()        # seems to be required to get rendered size
height = dummy.winfo_height()
dummy.grid_forget()             # we don't want users seeing this widget

for row in range(5):
    window.rowconfigure(row, minsize=height)

Это один из способов сделать это. Возможно, есть лучший, более прямой способ использования самого шрифта, но вы можете исследовать это, если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...