#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
в другом)