Развернуть список на 2 столбца Tkinter

#python #listbox #tkinter #widget

#python #список #tkinter #виджет

Вопрос:

У меня есть следующий интерфейс: 3 фрейма, из которых 2 находятся слева, frame1 frame2 и еще один, который находится справа frame3 .

Я хочу создать еще один фрейм, frame4 в котором будет метка Output , а под ней должен быть список. Я хочу, чтобы оба этих виджета охватывали предыдущие кадры, каждый из которых помещался в ячейку с помощью grid менеджера.

Также я не уверен, является ли Listbox виджетом, который я должен использовать. Я хочу что-то, что будет содержать выходные данные программы, которую я буду запускать через свое приложение. Я тоже подумал Entry , но мне нужно что-то, в чем я мог бы отображать более одной строки.

Это код, который у меня есть до сих пор:

 from Tkinter import *

root = Tk()

frame1 = Frame(root)
frame1.grid(row=0,column=0)

frame2 = Frame(root)
frame2.grid(row=1,column=0)

frame3 = Frame(root)
frame3.grid(row=0,column=1)

frame4 = Frame(root)
frame4.grid(row=2,columnspan=2)
l5 = Label(frame4, text='Output:').grid(row=2,columnspan=2)
output = Listbox(frame4, height=5)
#output.grid(row=2,column=0,columnspan=2)
#output.pack(side=LEFT,  fill=BOTH, expand=1)

root.mainloop()
  

Мне удалось сделать так, чтобы метка охватывала другие фреймы, но когда я раскомментировал одну из последних 2 строк, интерфейс не открылся, и программа просто зависла.

Как я могу это решить?

Комментарии:

1. Вы не должны смешивать менеджеры компоновки пакетов и сеток.

2. @Marcin: Я пробовал только один вариант за раз, а не оба одновременно.

Ответ №1:

Я немного исправил ваш код:

 from tkinter import * # for python 2.7 use Tkinter

root = Tk()


frame1 = Frame(root, bg='red', height=20)
frame1.grid(row=0,column=0, sticky=W E)

frame3 = Frame(root, bg='blue', height=20)
frame3.grid(row=0,column=1, sticky=W E)

frame2 = Frame(root, bg='green',  height=20)
frame2.grid(row=1,column=0, sticky=W E)



frame4 = Frame(root)
frame4.grid(row=2,columnspan=2, sticky=E W)

l5 = Label(frame4, text='Output:', bg='orange').grid(row=0, column=0, sticky=E W)
output = Listbox(frame4, height=5, width=50)
output.grid(row=1,column=0)
#output.pack(side=LEFT,  fill=BOTH, expand=1)

root.mainloop()
  

Это приводит к:

введите описание изображения здесь

Итак, в основном, что я сделал, так это добавил bg , height и sticky параметры к фреймам и меткам, чтобы легко визуализировать, что происходит и как они расположены. Также я изменил grid параметры listbox и label.

Надеюсь, это то, что вам нужно, или это поможет вам добраться туда.

Комментарии:

1. Ваш ответ был бы немного лучше, если бы вы объяснили, что вы сделали. Без этого мы вынуждены сравнивать построчно с оригиналом, чтобы увидеть, что вы сделали по-другому.

2. @BryanOakley Техас. Я добавил больше информации о том, что я изменил.

3. @Marcin: Спасибо! Это именно то, что я хотел.

Ответ №2:

Если вы используете оба .grid() и .pack() Tkinter (python 2.x) или tkinter (python 3.x) с радостью проведете остаток своей жизни, пытаясь найти способ удовлетворить оба, вы должны использовать один в том же окне или фрейме, см. http://www.openbookproject.net/py4fun/gui/tkPhone.html

Комментарии:

1. чтобы уточнить: это верно только тогда, когда вы используете grid и pack в том же содержащем фрейме или окне. Вы можете использовать оба в одном приложении в целом (то есть: grid в одном фрейме, pack в другом)