2012-08-16 6 views
5

Я создал рамку, а затем холст.
Что я хочу сделать дальше, так это добавить кнопку на холсте.
Однако, когда я упаковал кнопку, я не могу увидеть Холст!Как создать кнопку на холсте tkinter?

Вот что я пробовал:

from Tkinter import Tk, Canvas, Frame, Button 
from Tkinter import BOTH, W, NW, SUNKEN, TOP, X, FLAT, LEFT 

class Example(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.parent = parent 
     self.initUI() 

    def initUI(self): 
     self.parent.title("Layout Test") 
     self.config(bg = '#F0F0F0') 
     self.pack(fill = BOTH, expand = 1) 
       #create canvas 
     canvas1 = Canvas(self, relief = FLAT, background = "#D2D2D2", 
              width = 180, height = 500) 
     canvas1.pack(side = TOP, anchor = NW, padx = 10, pady = 10) 
     #add quit button 
     button1 = Button(canvas1, text = "Quit", command = self.quit, 
                  anchor = W) 
     button1.configure(width = 10, activebackground = "#33B5E5", 
                 relief = FLAT) 
     button1.pack(side = TOP) 

def main(): 
    root = Tk() 
    root.geometry('800x600+10+50') 
    app = Example(root) 
    app.mainloop() 

if __name__ == '__main__': 
    main() 

ответ

11

Tkinter pack менеджер не пытается изменить размер родительского виджета на правильный размер, чтобы содержать его дочерние виджеты, и не больше, по умолчанию. Таким образом, холст есть, но он точно такой же, как и кнопка, и тем самым невидим.

Если вы хотите разместить виджет на холсте без заставляя холст динамически изменять размер, вы хотите Canvas.create_window() функцию:

# ... snip ... 
button1 = Button(self, text = "Quit", command = self.quit, anchor = W) 
button1.configure(width = 10, activebackground = "#33B5E5", relief = FLAT) 
button1_window = canvas1.create_window(10, 10, anchor=NW, window=button1) 

Это создаст свою кнопку с левым верхним углом в (10, 10) относительном на холст, без изменения размера самого холста.

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

+0

Спасибо, что так много полезно! – Tony

2

вы можете использовать button1.place (х = 0, у = 0) геометрии менеджера вместо пакета (сторона = TOP) пакет изменить размер главного виджета делает его достаточно большим, чтобы держать дочерний виджет

http://effbot.org/tkinterbook/pack.htm#Tkinter.Pack.pack_propagate-method

http://effbot.org/tkinterbook/place.htm

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