2016-05-30 3 views
2

Этот код создает два холста в окне. Однако Python не привязывает их друг к другу, но создает промежуток между ними. Этот пробел становится еще шире, когда я изменяю размер окна.Как предотвратить разрыв между двумя холстами в python

from Tkinter import * 

class App: 
    def __init__(self,master): 

     master.title('Python Canvas Testing') 
     master.minsize(width=550, height=450) 

     settingscanvas = Canvas(master,bg="yellow") 
     settingscanvas.pack(side='top',anchor='nw',expand=True,fill='x') 

     datacanvas = Canvas(master,bd=1,bg="green") 
     datacanvas.pack(side='top',anchor='nw',expand=True,fill='both') 

     for r in xrange(15): 
      Label(settingscanvas, text='Label'+str(r+1)).grid() 

     Label(datacanvas, text='Label 2').grid() 

## create main program window 
window = Tk() 

## create window container 
app = App(window) 

mainloop() 

Есть ли какой-либо вариант, который мне не хватает, чтобы скрепить два холста вместе, чтобы не было пробелов?

+0

@ TadhgMcDonald-Jensen: смешивание 'pack' и' grid' не только возможно, но и хорошая практика. Единственный раз, когда вы не можете этого сделать, - это два или более виджетов, которые имеют общий родительский элемент. В этом случае у виджетов есть разные родители. –

+0

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

ответ

1

Оба виджета имеют expand, установленные на True, поэтому каждому из них назначается дополнительное пространство. Если вы хотите получить только одно место, установите expand в False для другого. Если вы хотите, чтобы им было предоставлено некоторое дополнительное пространство, обязательно установите fill, чтобы включить направление y.

+0

Спасибо, это было очень полезно. Поскольку в моем приложении первый холст не изменяется в содержимом, я мог бы установить его для расширения = False и теперь иметь желаемое поведение. У меня создалось впечатление, что для «заливки» требуется «expand = True», чего явно нет. –

1

Я не знаю, как заставить его работать с пакетом. Но вы можете сделать это с помощью диспетчера сетки. Чтобы иметь расширяемый виджет с сеткой, вам нужно установить две вещи. Во-первых, параметр «липкий» позволяет виджету заполнять пространство внутри своей ячейки в сетке («ew» заполняется горизонтально, «nsew» заполняется в обоих направлениях). Во-вторых, параметр веса столбца и/или строки делает его расходным, если положительным.

from tkinter import * 

class App: 
    def __init__(self,master): 
     master.title('Python Canvas Testing') 
     master.minsize(width=550, height=450) 

     settingscanvas = Canvas(master,bg="yellow") 
     settingscanvas.grid(sticky='ew') 

     datacanvas = Canvas(master,bd=1,bg="green") 
     datacanvas.grid(sticky='nsew') 

     master.grid_rowconfigure(1,weight=1) 
     master.grid_columnconfigure(0, weight=1) 

     for r in range(15): 
      Label(settingscanvas, text='Label'+str(r+1)).grid() 

     Label(datacanvas, text='Label 2').grid() 

## create main program window 
window = Tk() 

## create window container 
app = App(window) 

mainloop() 
+0

Я не пошел с вашим примером, потому что по какой-то причине я добрался до «пакета» в своем приложении, чтобы получить все виджеты там, где они должны быть. Тем не менее это решение также выполняет требование, определенное в моем примере здесь. –

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

  • Нет связанных вопросов^_^