2013-04-02 2 views
1

Я создаю очень простой пользовательский интерфейс с использованием Tkinter и python, но у меня возникают проблемы с настройкой элементов GUI и использованием формата сетки для правильного размещения. Вот приближение первого порядка, что я пытаюсь иметь:Проблемы с раскладкой сетки Python tkinter

Image

Вот код, у меня до сих пор. Я продолжаю приближаться, но я не думаю, что я действительно понимаю, что я делаю. Любая помощь высоко ценится!

#User interface 
root = Tk() 
window_width = root.winfo_screenwidth() 
window_height = root.winfo_screenheight() 
root.geometry ("%dx%d"%(window_width,window_height)) 

menu_bar = Menu(root) 
menu = Menu(menu_bar, tearoff=0) 
menu.add_command(label="Open", command = open_file) 
menu.add_command(label="Save", command = save) 
menu.add_separator() 
menu.add_command(label="Quit", command = exit) 
menu_bar.add_cascade(label="File",menu=menu) 

root.config(menu=menu_bar) 

#textbox is the window in which the code is written 
textbox = Text(root, width=50, height = window_height/20+4) 

#canvas is where the car will go 
canvas_frame= Frame(root, width = window_width/1.5, height = window_height-200) 
canvas_frame.configure(borderwidth=1.5,background='black') 
canvas = Canvas(canvas_frame, width = window_width/1.5, height = window_height-200) 

#console to print to 
console = Text(root, width = int(window_width/1.5), height = 10) 

run_button = Button(root, text = "Run", command = lambda:generate_program(textbox.get(1.0,END))) 

clear_button = Button(root, text = "Clear text", command = clear) 

#add them to frame 
textbox.grid(row=0, column=0, rowspan=20, columnspan=10) 
run_button.grid(row=21,column=0) 
clear_button.grid(row=21,column=1) 
canvas_frame.grid(row=0,rowspan=10,column=21,columnspan=25) 
canvas.grid(row=0, rowspan=1, column=21, columnspan=25) 
console.grid(row = 1, rowspan=1, column = 21, columnspan=25) 

root.mainloop() 

ответ

2

На мой взгляд, это макет может быть намного проще с менеджером геометрии упаковки. Одна из проблем заключается в том, что вы пытаетесь сделать ширину и высоту каждого виджета подходящим на своем месте с параметрами rowspan и columspan. Кроме того, поскольку canvas находится внутри рамки, вы должны думать, что это похоже на новое окно, поэтому достаточно простого вызова canvas.grid().

Однако с pack() вы просто должны поставить textbox, run_button и clear_button внутри нового кадра:

left_frame = Frame(root) 
textbox = Text(left_frame, ...) 
run_button = Button(left_frame, ...) 
clear_button = Button(left_frame, ...) 

canvas_frame= Frame(root, ...) 
canvas_frame.configure(borderwidth=1.5,background='black') 
canvas = Canvas(canvas_frame, ...) 
console = Text(root, ...) 

left_frame.pack(side=LEFT) 
textbox.pack() 
run_button.pack(side=LEFT) 
clear_button.pack() 
canvas_frame.pack() 
canvas.pack() 
console.pack() 
+2

Согласованный - есть совершенно очевидно, левая сторона и правая сторона. Я бы начал с пакета для этого. Затем на каждой из этих сторон есть верхняя и нижняя секции. Хорошая вещь о сетке для верхней/нижней части состоит в том, что вы можете назначить вес, чтобы получить более эффективное изменение размера. Кроме того, наличие левой и правой сторон облегчает добавление окна в будущее. –

+0

Удивительный! Спасибо! – Mason

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