2014-11-24 1 views
3

Я хочу сделать окно, которое позволяет разделить текстовые экраны в Tkinter. Я также хочу иметь возможность «растягивать» экраны с помощью мыши, поэтому, например, если я хочу, чтобы один из экранов был временно больше другого, я просто перетаскиваю его с помощью мыши.Сделайте растяжимый разделительный экран в Tkinter

Я думал, что смогу разместить виджет «Текст» внутри виджета PanedWindow, так как я думал, что виджет PanedWindow всегда растяжимый, но мой код не совсем выполняет эту работу. Я могу получить разделенные экраны, но они не растяжимы. Вот мой (Ненужный длинный, но простой) код:

from Tkinter import * 
root = Tk() 

# Seems strange to column- and rowconfigure the root but if I don't - 
# the text widgets won't resize at all 
for i in range(4): 
    root.columnconfigure(0, weight=1) 
for i in range(1,3): 
    root.rowconfigure(1, weight=1) 

# make a master PanedWindow 
m1 = PanedWindow(root) 
m1.grid(column=0, row=0, rowspan=4, columnspan=4, sticky=E+N+W+S) 
for i in range(4): 
    m1.columnconfigure(i, weight=1) # Enable vertical resizing 
for i in range(1,3): 
    m1.rowconfigure(i, weight=1) #Enable horizontal resizing 

# make a PanedWindow inside m1, positioned to the left 
m2=PanedWindow(m1) 
m2.grid(column=0, row=1, columnspan=2, rowspan=2, sticky=E+N+W+S) 
for i in range(2): 
    m2.columnconfigure(i, weight=1) # Enable vertical resizing 
for i in range(1,3): 
    m2.rowconfigure(i, weight=1) #Enable horizontal resizing 

# make another PanedWindow inside m1, positioned to the right 
m3=PanedWindow(m1) 
m3.grid(column=2, row=1, columnspan=2, rowspan=2, sticky=E+N+W+S) 
for i in range(2, 4): 
    m3.columnconfigure(i, weight=1) # Enable vertical resizing 
for i in range(1,3): 
    m3.rowconfigure(i, weight=1) #Enable horizontal resizing 

# Add a text widget in m2 
text1 = Text(m2, height=15, width =15) 
m2.add(text1) 

# Add another textwidget in m3 
text2=Text(m3, height=15, width=15) 
m3.add(text2) 

root.mainloop() 

ответ

3

Основная проблема с вашим кодом является то, что вы не используете PanedWidnow правильно. Например, вы не можете pack или grid один PanedWindow внутри другой. Чтобы разместить один виджет внутри PanedWindow, вы должны использовать метод paned window .add(). Итак, чтобы положить m2 внутри m1, вы должны сделать m1.add(m2). Обработайте PanedWindow, как Frame, и .add() является эквивалентом .pack() или .grid().

Кроме того, кажется, что вы думаете, что PanedWindow - это панель, которой она не является. Если вы хотите три панели для трех бок о бок окон, вам нужно создать только один экземпляр PanedWindow, а затем вызвать .add(...) три раза, один раз для каждого дочернего окна. В то время как вы можете положить окна в стеклянном окне, это редко бывает, если вы не горизонтальны, а другие вертикальны. Для большинства случаев вам нужен только один экземпляр PanedWindow.

+0

Это было очень хорошо объяснено, спасибо! – PandaDeTapas

2

Вы делаете это слишком сложно. Только после первого примера here, я сделал то, что вы хотите:

from Tkinter import * 
root = Tk() 

m = PanedWindow(root) 
m.pack(fill=BOTH, expand=1) 

text1 = Text(m, height=15, width =15) 
m.add(text1) 

text2=Text(m, height=15, width=15) 
m.add(text2) 

root.mainloop() 
+0

Да, я забыл сказать, что я предпочел бы сделать это с помощью grid(), (из-за некоторой сложности), менеджера геометрии. Но это тоже, оцените! – PandaDeTapas

+1

Масштабирование работает только между панелями в «PanedWindow», а не между столбцами и строками «сетки». Вы можете создать новый 'PanedWindow' внутри другого 'PanedWindow', как во втором примере из опубликованной ссылки, которая создает своего рода масштабируемую сетку. – fhdrsdg

+1

@PandaDeTapas: вы все равно можете использовать сетку. Выбор сетки, пакета или места не влияет на использование класса PanedWindow. –

Смежные вопросы