2013-10-14 20 views
6

Voglio ottenere un pulsante da una tela. Ho provato a pack la tela nel widget del pulsante, ma non ha funzionato. Googling un po ', ho trovato (qui: How do you create a Button on a tkinter Canvas?) che il metodo Canvas create_window potrebbe aiutare. Ma dovrebbe esserci qualcosa di sbagliato nel modo in cui lo sto usando.Come creare un pulsante usando il widget tkinter Canvas?

import Tkinter 

DIM = 100 

root = Tkinter.Tk() 
frame = Tkinter.Frame(root) 

button = Tkinter.Button(None, width=DIM, height=DIM, command=root.quit) 

circle = Tkinter.Canvas(frame, width=DIM, height=DIM) 
circle.create_oval(5, 5, DIM-5, DIM-5, fill="red") 
circle.create_window(0, 0, window=button) 

frame.grid() 
circle.grid(row=1, column=1) 

root.mainloop() 

Se io cancellare la linea create_window, se posso la mia pittura ma non posso (ovviamente) clicca su di esso. Ma in questo modo, il widget del pulsante copre la mia circonferenza e mostra un triste pulsante vuoto.

Fondamentalmente, voglio creare un pulsante con un cerchio rosso dipinto all'interno.

risposta

10

Tkinter non consente di disegnare direttamente su widget diversi dalla tela, e i disegni su tela saranno sempre al di sotto dei widget incorporati.

La soluzione semplice consiste nel creare l'effetto di un pulsante utilizzando solo la tela. Non c'è davvero niente di speciale nel fare questo: basta creare una tela, quindi aggiungere i collegamenti per ButtonPress e ButtonRelease per simulare un pulsante premuto.

Ecco un'idea approssimativa:

class CustomButton(tk.Canvas): 
    def __init__(self, parent, width, height, color, command=None): 
     tk.Canvas.__init__(self, parent, borderwidth=1, 
      relief="raised", highlightthickness=0) 
     self.command = command 

     padding = 4 
     id = self.create_oval((padding,padding, 
      width+padding, height+padding), outline=color, fill=color) 
     (x0,y0,x1,y1) = self.bbox("all") 
     width = (x1-x0) + padding 
     height = (y1-y0) + padding 
     self.configure(width=width, height=height) 
     self.bind("<ButtonPress-1>", self._on_press) 
     self.bind("<ButtonRelease-1>", self._on_release) 

    def _on_press(self, event): 
     self.configure(relief="sunken") 

    def _on_release(self, event): 
     self.configure(relief="raised") 
     if self.command is not None: 
      self.command() 

Per completare l'illusione si vorrà impostare un vincolante per <Enter> e <Leave> (per simulare lo stato attivo), e anche fare in modo che il cursore si trova sopra la pulsante su un pulsante di rilascio - nota come i pulsanti reali non fanno nulla se sposti il ​​mouse prima di rilasciarlo.

1

Che cosa si può fare è legano la tela al mouse:

import Tkinter 

DIM = 100 

root = Tkinter.Tk() 
frame = Tkinter.Frame(root) 

circle = Tkinter.Canvas(frame) 
circle.create_oval(5, 5, DIM-5, DIM-5, fill="red") 

frame.grid() 
circle.grid(row=1, column=1) 

################################## 
def click(event): 
    root.quit() 

circle.bind("<Button-1>", click) 
################################## 

root.mainloop() 

Ora, se un utente fa clic all'interno della tela, la funzione click saranno chiamati (in sostanza, la tela è stato ora reso un pulsante) .

Si noti che la chiamata click verrà richiamata se un utente fa clic su in qualsiasi punto nell'area di disegno. Se vuoi fare in modo che click venga chiamato solo quando un utente fa clic nella cerchia, puoi utilizzare event.x e event.y per ottenere una sospensione delle coordinate x e del clic. Una volta ottenuti questi, è possibile eseguire un calcolo per determinare se tali coordinate si trovano all'interno della cerchia. Here è un riferimento su questo.

Problemi correlati