В моем коде пользователь может добавлять текст и виджеты в фрейм. Иногда строка заканчивается полем со списком, иногда меткой. Иногда эти виджеты выходят за пределы рамки. Есть ли способ разместить виджеты, такие как 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()
combobox.grid(строка=строка1, столбец=1, липкий=W) и Labeltext.grid(строка=строка, столбец=0, липкий=W). У меня 4 ярлыка и 2 комбокса
Вам нужны фактические столбцы? Например, если поле со списком переносится на вторую строку, и это виджет, а не метка, поэтому столбец увеличивается? Другими словами, вам нужна буквальная сетка или вам нужен просто список строк с содержимым, которое различается по размеру?
@Брайан Окли. Я только что нашел в строке 12. Что-то отсутствует ключевое слово.
@Bryan Oakley есть длинные ряды виджетов. Что мне нужно, так это способ определить конец фрейма, а затем перенести виджеты, выходящие из фрейма, в другую строку.
Итак, чтобы было ясно, вам не нужны столбцы, вы просто хотите, чтобы виджеты переносились?
Нет, мне не нужен столбец, мне нужно, чтобы виджеты были обернуты. Но мне нужен какой-то способ отметить положение виджета. И до сих пор я использовал столбцы, чтобы узнать расположение виджета в строке
Простое решение для размещения виджетов в ряд и переноса их, когда они не подходят, заключается в использовании текстового виджета для управления другими виджетами. Текстовый виджет имеет встроенные функции переноса.
Вот пример, который создает пару строк виджетов, которые необходимо обернуть. После открытия пользовательского интерфейса вы можете изменить его размер, чтобы увидеть, как виджеты динамически адаптируются к ширине окна.
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 и решение, которое вы дали. Большое спасибо.
знаете ли вы какой-либо способ подключить дополнительную информацию, например строку, к виджету. как v = метка['information_variable']
@Kazkuris Каждый виджет может быть классом, основанным на фрейме, с любым количеством другой информации и других виджетов.
@Kazkuris Это решение не помещает виджеты в сетку. Ваш вопрос был неясен о том, нужна ли вам сетка или просто строка, которая обертывается. Это дает вам возможность создать строку, которая переносится.
#root.resizable(False, True) bframe = Frame(root, width=80, height=100)