Tkinter Как обрезать виджеты и метки, выходящие за ширину рамки?

В моем коде пользователь может добавлять текст и виджеты в фрейм. Иногда строка заканчивается полем со списком, иногда меткой. Иногда эти виджеты выходят за пределы рамки. Есть ли способ разместить виджеты, такие как Combobox, во втором ряду и вырезать метки в конце фрейма, а остальную часть поместить также во второй ряд. Спасибо за помощь!

Рабочий минимальный код:

from tkinter import *
from tkinter import ttk
import re
import tkinter

root = Tk()
root.resizable(False, True)
bframe = Frame(root, width=300, height=50)
bframe.grid(row=0, column=0, sticky = W)
bframe.grid_propagate(False)

linelist1 = ['some long text 1 as a label', '@combo@Aa Bb Cc Dd', 'some long text 2 as a label', 'some long text 3 as a label', '@combo@Ee Ff Gg Hh', 'some long text 4 as a label']
lines_with_combobox = [e for e, s in enumerate(linelist1) if '@combo@' in s]

for line in range(0, len(linelist1)):
    if line in lines_with_combobox:
        delete_combo_marker = re.split("@combo@", linelist1[line])
        words = delete_combo_marker.pop(0)
        word_as_values = re.split('\s+', delete_combo_marker[0])
        combobox = ttk.Combobox(bframe,width=10, values=word_as_values)
        combobox.grid(row=0, column=line, sticky= W)
    else:
        text = linelist1[line]
        Labeltext = ttk.Label(bframe, justify=LEFT ,text=text, wraplength=730)
        Labeltext.grid(row=0, column=line, sticky = W)

root.mainloop()

#root.resizable(False, True) bframe = Frame(root, width=80, height=100)

toyota Supra 18.10.2022 22:02

combobox.grid(строка=строка1, столбец=1, липкий=W) и Labeltext.grid(строка=строка, столбец=0, липкий=W). У меня 4 ярлыка и 2 комбокса

toyota Supra 18.10.2022 22:12

Вам нужны фактические столбцы? Например, если поле со списком переносится на вторую строку, и это виджет, а не метка, поэтому столбец увеличивается? Другими словами, вам нужна буквальная сетка или вам нужен просто список строк с содержимым, которое различается по размеру?

Bryan Oakley 19.10.2022 00:47

@Брайан Окли. Я только что нашел в строке 12. Что-то отсутствует ключевое слово.

toyota Supra 19.10.2022 11:16

@Bryan Oakley есть длинные ряды виджетов. Что мне нужно, так это способ определить конец фрейма, а затем перенести виджеты, выходящие из фрейма, в другую строку.

Kazkuris 20.10.2022 12:48

Итак, чтобы было ясно, вам не нужны столбцы, вы просто хотите, чтобы виджеты переносились?

Bryan Oakley 20.10.2022 16:21

Нет, мне не нужен столбец, мне нужно, чтобы виджеты были обернуты. Но мне нужен какой-то способ отметить положение виджета. И до сих пор я использовал столбцы, чтобы узнать расположение виджета в строке

Kazkuris 08.11.2022 19:42
Почему в 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
7
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Простое решение для размещения виджетов в ряд и переноса их, когда они не подходят, заключается в использовании текстового виджета для управления другими виджетами. Текстовый виджет имеет встроенные функции переноса.

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

import tkinter as tk

data = """
The cow is of bovine ilk;
One end is moo, the other is milk.
"""

root = tk.Tk()
text = tk.Text(root, wrap = "char", background=root.cget("background"))
text.pack(fill = "both", expand=True)

for line in data.strip().split("\n"):
    for word in line.split(" "):
        label = tk.Button(text, text=word)
        text.window_create("end", window=label)
    text.insert("end", "\n")
text.configure(state = "disabled")

root.mainloop()

Это практически идеальное решение. Единственная проблема заключается в том, что я сильно полагаюсь на информацию столбца сетки с помощью .grid_info(), чтобы позже получить позицию виджета. Но я просто использую textvariable=line и решение, которое вы дали. Большое спасибо.

Kazkuris 20.10.2022 21:04

знаете ли вы какой-либо способ подключить дополнительную информацию, например строку, к виджету. как v = метка['information_variable']

Kazkuris 20.10.2022 21:29

@Kazkuris Каждый виджет может быть классом, основанным на фрейме, с любым количеством другой информации и других виджетов.

Bryan Oakley 20.10.2022 22:17

@Kazkuris Это решение не помещает виджеты в сетку. Ваш вопрос был неясен о том, нужна ли вам сетка или просто строка, которая обертывается. Это дает вам возможность создать строку, которая переносится.

Bryan Oakley 20.10.2022 22:19

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