2011-01-10 16 views
5

Sto imparando Tkinter e sto costruendo un semplice gioco di 8 puzzle.
(Esempio: http://www.permadi.com/java/puzzle8/)Edizione di Python Tkinter padding

Ogni numero è un oggetto Canvas inserito in una cornice utilizzando un layout di griglia. Uno degli oggetti sta aggiungendo una spaziatura extra tra gli oggetti Canvas. Ho impostato la larghezza del bordo sugli oggetti Canvas su -2, che ha risolto il problema di alcune persone, ma questo ha ridotto solo leggermente il riempimento extra per me. L'impostazione di questo valore su -4 inizia a tagliare nell'area di disegno.

Suppongo che le celle del layout della griglia abbiano un riempimento o una larghezza del bordo di default, ma non ho trovato un modo per rimuoverlo. L'impostazione dei valori padx, pady, ipadx, ipady quando si chiama grid() sugli oggetti Canvas non sembra essere di aiuto.

Un'altra stranezza che ho trovato è stato quando facendo un bordo per i miei oggetti di tela che ho usato create_rectangle, ma ho dovuto iniziare x_1 e y_1 a 4,4 invece di 0,0 o 2,2 che è quello che ci si aspetterebbe per un Confine 2px.

Ecco il mio codice. Qualsiasi aiuto/consiglio/soluzione alternativa/altrimenti è molto apprezzato.

#!/usr/bin/python 

from Tkinter import * 

class Number(Canvas): 
    def __init__(self, master=None, number=1): 
     Canvas.__init__(self, master, width=100, height=100, bd=-2) 
     self.create_text(50, 50, text=str(number), anchor=CENTER) 
     self.create_rectangle(4, 4, 98, 98, width=2) 


class Application(Frame): 
    def create_widgets(self): 
     self.playarea = Frame(self, width=300, height=300) 
     self.playarea.grid_propagate(0) 
     self.playarea.grid() 
     self.playarea.numbers = [] 
     for number in xrange(1, 10): 
      num_obj = Number(self.playarea, number) 
      self.playarea.numbers.append(num_obj) 
      row = number // 3 
      col = number % 3 
      num_obj.grid(row=row, column=col) 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.grid() 
     self.create_widgets() 


def main(): 
    app = Application() 
    app.master.title("Sample Application") 
    app.mainloop() 

if __name__ == '__main__': 
    main() 

risposta

9

Molto probabilmente la causa del problema è che si sta trascurando di impostare l'attributo highlightthickness di ogni tela a zero. Questo valore controlla un anello colorato attorno al widget utilizzato per indicare che è attivo.

Ecco un trucco quando si tenta di risolvere questi tipi di problemi di layout: assegnare a ciascun widget un colore di sfondo diverso (ad esempio: la finestra radice un colore, il riquadro interno un colore, la tela un colore). Puoi quindi utilizzare i colori come guida per vedere quale widget possiede lo spazio che stai cercando di eliminare.

+1

highlightthickness era il colpevole. Grazie per l'aiuto! Anche il trucco di base ha funzionato a meraviglia. – zrbecker

+1

+10 per "Assegnare a ciascun widget un diverso colore di sfondo". L'ho usato prima per un problema di layout complicato ma l'ho dimenticato fino a quando non l'hai menzionato. –