2015-10-09 2 views
1

Я изучал некоторый python, и я начал разрабатывать приложение, которое позволит пользователю создавать некоторые произведения искусства с использованием графического интерфейса и холста в окне Tkinter с помощью кнопок и полей Tkinter. buttons are very far apartКнопки Python Tkinter очень далеки друг от друга

Однако, по какой-то причине все эти кнопки очень далеки друг от друга, и я не совсем уверен, по какой логике определяется их точное положение. Вот мой код, который устанавливает окна и кнопки:

area = Canvas(self) 
area.grid(row = 1, column=0, columnspan=2, rowspan=28, padx=5, sticky = E+W+S+N) 
#columns 
self.columnconfigure(1, weight=1) 
self.columnconfigure(3, pad=7) 
self.rowconfigure(3, weight=1) 
self.rowconfigure(5, pad=7) 
#Background Colour 
colourL = Label(self, text="Background colour:") 
colourL.grid(row=1, column=3) 
colourbg = Entry(self) 
colourbg.grid(row = 1, column=4) 
#Turtle Colour 
turtcL = Label(self, text="Turtle colour:") 
turtcL.grid(row=2, column=3) 
turtcol = Entry(self) 
turtcol.grid(row = 2, column=4) 
setCol=Button(self, text="Set colours",command=lambda: setColour(alex,turtcol.get(),area,colourbg.get())) 
setCol.grid(row=2, column=5) 
#Fractal Button 
fractalL = Label(self, text="Order of Fractal:") 
fractalL.grid(row=5, column=4) 
fractorder = Entry(self) 
fractorder.grid(row = 6, column=4) 
#Buttons 
drawButton = Button(self, text="Draw", command=lambda: draw(100, turtles, 80)) 
drawButton.grid(row=3, column=3) 

Я был бы очень признателен, если кто-то может сказать, что я, почему и как сделать кнопки и поля быть ближе друг к другу.

+1

вы звоните 'grid_rowconfigure' или' grid_columnconfigure' где-нибудь? –

+0

отредактирует op с настройками конфигурации – Oliver

+0

, и я понял, что проблема заключается в том, как работают настройки? – Oliver

ответ

2

В вашем вопросе недостаточно кода, чтобы точно сказать, что происходит. Я предполагаю, что строка 3 получает больший вес, чем другие строки.

Однако вместо того, чтобы преследовать ошибку, я рекомендую две модификации того, как вы собираетесь создавать свой графический интерфейс.

Прежде всего, вместо того, чтобы ставить все в единую сетку, разделите свой графический интерфейс пополам. У половины есть холст, и ничто другое, другая половина имеет кучу кнопок. Для меня естественная организация должна начать с создания рамки для размещения кнопок. Затем используйте pack, чтобы поместить холст слева и рамку справа.

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

Во-вторых, поместите все ваши звонки в grid вместе, чтобы вы могли более легко визуализировать все сразу.

Это будет выглядеть примерно так. Обратите внимание, что все кнопки используют control в качестве родителя. Кроме того, виджеты ввода используют параметр sticky, чтобы заполнить пространство, которое им было предоставлено. Вы можете сделать то же самое с кнопками, если хотите, чтобы все они были одинакового размера. Вы также можете использовать атрибут sticky для выравнивания ваших меток либо влево, либо вправо, в зависимости от того, как вы хотите, чтобы GUI выглядел.

... 
# create the two sides: 
area = Canvas(self) 
controls = Frame(self) 

area.pack(side="left", fill="both", expand=True) 
controls.pack(side="right", fill="both", expand=False) 

# create the buttons and labels 
colourL = Label(controls, text="Background colour:") 
colorbg = Entry(controls) 

turtcL = Label(controls, text="Turtle colour:") 
turtcol = Entry(controls) 
setCol = Button(controls, text="Set colours",command=lambda:  

fractalL = Label(controls, text="Order of Fractal:") 
fractorder = Entry(controls) 

drawButton = Button(controls, text="Draw", command=lambda: draw(100, turtles, 80)) 

# now, arrange them on the screen 
colourL.grid(row=1, column=1) 
colourbg.grid(row=1, column=2, sticky="ew" 
turtcL.grid(row=2, column=1) 
turtcol.grid(row=2, column=2, sticky="ew") 
setCol.grid(row=2, column=3) 
drawButton.grid(row=3, column=1) 
fractalL.grid(row=5, column=2) 
fractorder.grid(row=6, column=2, sticky="ew") 
... 

Наконец, при использовании grid, вы всегда должны дать по крайней мере один столбец и одну строку положительный «вес». Это говорит tkinter, где нужно предоставить дополнительное пространство после размещения виджетов на своем месте.

Предполагая, что вы хотите, чтобы все кнопки были сверху, вы можете дать строке 7 (строка после последней строки виджетов) положительный вес. Кроме того, если вы хотите, чтобы столбец, который содержит записи, чтобы быть как можно более широким, вы можете дать столбец 2 вес:

controls.grid_rowconfigure(7, weight=1) 
controls.grid_columnconfigure(2, weight=1) 
Смежные вопросы