2012-08-16 260 views
5

Creé un Marco y luego un Lienzo.
Lo que quiero hacer a continuación es agregar un botón en el lienzo.
Sin embargo, cuando empaqué el botón no puedo ver el lienzo.¿Cómo se crea un botón en un Canvas de tkinter?

Aquí es lo que he intentado:

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() 

Respuesta

11

El Tkinter pack gerente intenta cambiar el tamaño del widget padre al tamaño correcto para contener sus widgets hijos, y no más grande, de forma predeterminada. Entonces el lienzo está allí, pero es exactamente del mismo tamaño que el botón y, por lo tanto, invisible.

Si desea colocar un widget en un lienzo sin causando el lienzo para cambiar el tamaño de forma dinámica, desea que la función 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) 

Esto creará el botón con la esquina superior izquierda en (10, 10) relativa al lienzo, sin cambiar el tamaño del lienzo en sí.

Tenga en cuenta que podría reemplazar el argumento window con una referencia a cualquier otro widget Tkinter. Una advertencia, sin embargo: el widget nombrado debe ser un elemento secundario de la ventana de nivel superior que contiene el lienzo, o un elemento secundario de algún widget ubicado en la misma ventana de nivel superior.

+0

Gracias, que es tanto útil! – Tony

Cuestiones relacionadas