2014-09-09 2 views
1

Я использую python tkinter для создания ui, содержащего фигуру matplotlib и некоторые кнопки, но мне трудно изменить размер окна и его содержимое. Я рассмотрел некоторые примеры на этом сайте и в документах, и, насколько я понимаю, для кадра, содержащего более мелкие кадры для изменения размера, все они должны быть настроены индивидуально. Каждый получает вес, применяемый к нему, чтобы определить, сколько из доступного пространства он получает (это правильно?). Однако, когда я пытаюсь применить это, как показано ниже, ни один из кадров не изменяет размер. Кроме того, если значение wiegth равно нулю для конфигурации столбца, а 1 для строки configure означает, что оно будет изменять только в одном направлении?Изменение размеров окон и содержимого tkinter

import Tkinter 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
from matplotlib.figure import Figure 
class Application(): 
    def __init__(self, master): 


     frame2 = Tkinter.Frame(master, height=510, width=770, bg='red') 
     frame2.grid(row=0, column=0, sticky='nsew') 
     frame2.columnconfigure(0, weight=1) 
     frame2.rowconfigure(0, weight=1) 

     frame2a = Tkinter.Frame(frame2, height=80, width=770, bg='blue') 
     frame2a.grid(row=0, column=0, sticky='nsew') 
     frame2a.columnconfigure(0, weight=1) 
     frame2a.rowconfigure(0, weight=1)   

     frame2b = Tkinter.Frame(frame2, height=410, width=770, bg='green') 
     frame2b.grid(row=1, column= 0, sticky='nsew') 
     frame2b.columnconfigure(0, weight=1) 
     frame2b.rowconfigure(1, weight=1)  

     # add plot 
     fig = Figure(figsize=(9.5,5.2), facecolor='white') 
     fig.add_subplot(111)   
     canvas = FigureCanvasTkAgg(fig, master=frame2b) 

     canvas.show() 
     canvas.get_tk_widget().pack(side='top', fill='both', expand=1) 

if __name__ == '__main__' : 

    root = Tkinter.Tk() 
    root.geometry("770x510") 
    app = Application(root) 
    root.mainloop() 

ответ

1

Ваш подход с использованием columnconfigure и rowconfigure правильно, но вы забыли одну вещь: Вы не использовали методы на мастер окна. Таким образом, вы в основном хотят, чтобы сделать это:

def __init__(self, master): 
    master.columnconfigure(0, weight=1) 
    master.rowconfigure(0, weight=1) 

Чтобы ответить на другой вопрос (Кроме того, если wiegth равен нулю для columnconfigure и 1 для строки конфигурирования не означает, что он будет изменять размеры только в одном направлении?): Да, вы правы, виджет/окно будет распространяться только в одном или ничем направлении.

Кроме того, поскольку вы используете grid для динамического изменения размера, параметры height и width устарели.

+1

Я бы добавил: если вы смешиваете и сопоставляете '.pack() 'и' .grid() ', и размещаете виджеты с сеткой _inside_ упакованный виджет, вы должны применять' .columnconfigure' и '.rowconfigure' к этому упакованному виджета тоже. В противном случае упакованный виджет не будет динамически изменять размер для дочерних элементов (привязанных к сетке). Для меня это было неинтересно, поскольку я изначально считал, что упакованные объекты не могут использовать методы «.columnconfigure» и '.rowconfigure' (поскольку они обычно используются для сетчатых элементов). – anonnoir

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