2012-03-05 21 views
5

Sto provando a trasmettere il contenuto di un database a un widget Tkinter. Il database ha abbastanza righe e colonne per il punto in cui ho bisogno di avere sia barre di scorrimento orizzontali che verticali abilitate, ma ho difficoltà a far funzionare lo scorrimento orizzontale e verticale simultaneamente. Sono agnostica su quali widget di Tkinter viene utilizzato, ma qui è il mio attuale implementazione:Barre di scorrimento verticali e orizzontali su Tkinter Widget

# Create root 
self.root = Tk() 
self.root.geometry('1000x500+0+0') 

# Create canvas 
self.canvas = Canvas(self.root) 
self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) 

# Create scrollbars 
self.xscrollbar = Scrollbar(self.root, orient=HORIZONTAL, command=self.canvas.xview) 
self.xscrollbar.pack(side=BOTTOM, fill=X) 
self.yscrollbar = Scrollbar(self.root, orient=VERTICAL, command=self.canvas.yview) 
self.yscrollbar.pack(side=RIGHT, fill=Y) 

# Attach canvas to scrollbars 
self.canvas.configure(xscrollcommand=self.xscrollbar.set) 
self.canvas.configure(yscrollcommand=self.yscrollbar.set) 

# Create frame inside canvas 
self.frame = Frame(self.canvas) 
self.canvas.create_window((0,0), window=self.frame, anchor=NW) 
self.frame.bind('<Configure>', self.set_scrollregion) 

# Write db contents to canvas 
self.print_dbcontents() 

# Invoke main loop 
self.root.mainloop() 

def set_scrollregion(self, event): 
    self.canvas.configure(scrollregion=self.canvas.bbox('all')) 

In questa implementazione, posso solo lo scorrimento a lavorare in una direzione, a seconda di come imballo la tela:

self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) # scrolling works in x but not y 
self.canvas.pack(side=LEFT, fill=BOTH, expand=TRUE) # scrolling works in y but not x 

Ho solo bisogno di ottenere lo scorrimento orizzontale e verticale per lavorare contemporaneamente, o trovare una soluzione alternativa.

+0

[Esempio di scorrimento] (http://www.tkdocs.com/tutorial/canvas.html#scrolling) dal tutorial funziona come previsto (le importazioni devono essere modificate per Python 2.x). – jfs

risposta

8

Non vedo alcun codice che impedisca il funzionamento delle barre di scorrimento. Vedo un problema che impedisce a una delle barre di scorrimento di mostrare dove ci si aspetta (supponendo che si aspettino che appaiano nel luogo tradizionale). È questo che intendi quando dici che vuoi che "lavorino simultaneamente"?

Il layout è fatto con il seguente codice e nel seguente ordine:

self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) 
self.xscrollbar.pack(side=BOTTOM, fill=X) 
self.yscrollbar.pack(side=RIGHT, fill=Y) 

Quella prima riga causa la tela per riempire l'intera parte superiore del widget, tutta la strada da sinistra per tutta la strada a destra. Quando in seguito si posiziona la yscrollbar sulla destra, significa che si sposta a destra dello spazio rimasto su dopo che la tela si è riempita nella parte superiore dello. Poiché la tela si riempie in alto, non c'è spazio a sinistra, solo sotto. Pertanto, la barra di scorrimento verrà visualizzata come un piccolo widget sull'altezza della barra di scorrimento orizzontale sotto la tela.

Una soluzione rapida è di impacchettare prima la barra di scorrimento verticale, quindi l'orizzontale e quindi la tela. Il tuo widget "principale" dovrebbe sempre essere una delle ultime cose che impacchetta/griglia. Uno, lo fai per l'ovvia ragione che devi in ​​questo caso per ottenere l'effetto desiderato, ma anche perché rende corretto il tuo comportamento di ridimensionamento. Sto andando fuori tema per spiegare perché in questa risposta, quindi leggi this answer on stackoverflow per maggiori informazioni.

In secondo luogo, quando si lavora con le barre di scorrimento è preferibile utilizzare la griglia se si desidera un aspetto professionale. Se usi pack, le barre di scorrimento non allineeranno la proprietà nell'angolo in cui si incontrano. Si desidera loro di guardare in questo modo, con un piccolo spazio vuoto nell'angolo in basso a destra:

|| 
== 

Tuttavia, se si utilizza pacchetto faranno apparire come uno di questi:

|| -or-  || 
====   ==|| 

Infine , Ti invito a nonimport *, potrebbe causare problemi lungo la strada. Invece, prendi l'abitudine di fare import Tkinter as tk e poi prefisso tutti i comandi tk con "tk". (es .: tk.Canvas, ecc.). Vedrai perché questo è importante la prima volta che provi a mescolare i widget ttk e tkinter nella stessa interfaccia utente, ma potresti anche avere problemi altrove se anche "importa *" da altri pacchetti. Inoltre, in questo modo è ovvio quando si utilizzano le funzioni di tk e quando si utilizzano le funzionalità di altri pacchetti.

Problemi correlati