Проблема Tkinter с использованием длины переноса в виджете Label, организованном в сетке
Таким образом, у меня есть 2 строки, выделенные для виджета с метками для обмена сообщениями, для отображения любых успешных / неудачных сообщений пользователю, пока они используют графический интерфейс tkinter. Некоторые сообщения должны быть длинными, чтобы соответствовать ширине столбца, поэтому я использовал функцию обтекания для виджета "Метка", чтобы перенести текст на следующую строку.
Проблема, с которой я столкнулся, заключается в том, что из-за этой функции он перемещает размещения виджетов под этим виджетом на 1 строку для каждой новой строки, в которую он переносит текст.
Поэтому мне было интересно, есть ли способ обтекания текстом без перемещения нижних виджетов.
Как выглядит метка сообщения в GUI с height = 1:
Как выглядит метка сообщения при переносе текста на новую строку с высотой = 1:
Как выглядит метка сообщения в GUI с height = 2:
Как выглядит метка сообщения при переносе текста на новую строку с высотой = 1:
Мне бы хотелось, чтобы метка сообщения во 2-й ссылке на изображение отображалась так, как она есть, но при этом сохранялась вертикальная компоновка виджетов, как видно на 1-й ссылке на изображение.
Следующий код предназначен для определения виджетов:
Choice_list = Listbox(window, selectmode=SINGLE, width = 17, height = 9,
justify = CENTER)
image = PhotoImage(file = 'Dummy_Logo.gif')
Image_label = Label(window, image = image)
extract = Button(window, text = "Archive News from Webpage",
command = func1, width = 20)
archive = Button(window, text = "Extract News from Archive",
command = func2, width = 22)
display = Button(window, text = "Display the News",
command = func3, width = 14)
Message_Widget = Label(window, text = '', fg = 'black', justify = CENTER,
height = 2, wraplength = 300)
Log_Event = Checkbutton(window, text = 'Log Event', variable = logState,
command = logEvent)
Следующий код представляет собой выравнивание сетки для виджетов:
Image_label.grid(row = 1, column = 1)
Choice_list.grid(row = 1, column = 2, rowspan = 9, sticky = W)
Message_Widget.grid(row = 2, column = 1, rowspan = 2)
Log_Event.grid(row = 12, column = 2)
archive.grid(row = 13, column = 1, rowspan = 2, sticky = W)
extract.grid(row = 13, column = 1, rowspan = 2, sticky = E)
display.grid(row = 13, column = 2, rowspan = 2, sticky = W)
3 ответа
Присвойте метке высоту 2 или 3. Проблема заключается в том, что по умолчанию она должна иметь высоту одного символа. Tkinter выделит высоту только одного символа при размещении всех виджетов. Когда текст переносится, метка просто должна стать выше, чтобы текст поместился.
Задав для начала высоту 2 или 3, это дополнительное пространство встроено в графический интерфейс. Когда текст переносится, ярлык не должен увеличиваться, чтобы вместить новый текст.
Это может быть неправильный метод решения этой проблемы, однако мне удалось получить результат, который я искал, только изменив параметр rowspan в Message_Widget на rowspan = 11.
Message_Widget.grid(row = 2, column = 1, rowspan = 11)
Это дало следующие результаты:
С кратким текстом:
Рассматривали ли вы использовать текстовый виджет для чтения?
Например, приведенный ниже код обернет текст, если он будет длинным, и не изменит размеры виджетов. Это всего лишь пример, но этого должно быть достаточно, чтобы помочь вам решить проблему.
from tkinter import *
import random
root = Tk()
text1 = Text(root, height=1, width=40, wrap="word")
text1.grid(row=0, column=0, sticky="ew")
def update_lbl1():
x = ["Click and drag to see some much longer random text for updating label!!!","some short data"]
text1.delete("1.0", "end")
text1.insert("1.0", random.choice(x))
Button(root, text="Change label from list", command = update_lbl1).grid(row=1, column=0)
root.mainloop()