2014-05-10 14 views
5

Quindi sto creando un lettore di rss utilizzando la libreria tkinter e in uno dei miei metodi creo un widget di testo. Visualizza bene fino a quando non provo ad aggiungere barre di scorrimento ad esso.Impossibile utilizzare il pacchetto geometry manager all'interno di

Ecco il mio codice prima che le barre di scorrimento:

def create_text(self, root): 
     self.textbox = Text(root, height = 10, width = 79, wrap = 'word') 
     self.textbox.grid(column = 0, row = 0) 

Qui è il mio codice dopo:

def create_text(self, root): 
     self.textbox = Text(root, height = 10, width = 79, wrap = 'word') 
     vertscroll = ttk.Scrollbar(root) 
     vertscroll.config(command=self.textbox.yview) 
     vertscroll.pack(side="right", fill="y", expand=False) 
     self.textbox.config(yscrllcommand=vertscroll.set) 
     self.textbox.pack(side="left", fill="both", expand=True) 
     self.textbox.grid(column = 0, row = 0) 

Questo mi dà l'errore

_tkinter.TclError: cannot use geometry manager pack inside .56155888 which already has slaves managed by grid on the line vertscroll.pack(side="right", fill="y", expand=False)

Delle idee come risolvere questo problema ?

risposta

10

Per the docs, non mescolare pack e grid nella stessa finestra maestro:

Warning: Never mix grid and pack in the same master window. Tkinter will happily spend the rest of your lifetime trying to negotiate a solution that both managers are happy with. Instead of waiting, kill the application, and take another look at your code. A common mistake is to use the wrong parent for some of the widgets.

Quindi, se si chiama grid sulla casella di testo, non chiamare pack sulla barra di scorrimento.


import Tkinter as tk 
import ttk 

class App(object): 
    def __init__(self, master, **kwargs): 
     self.master = master 
     self.create_text() 

    def create_text(self): 
     self.textbox = tk.Text(self.master, height = 10, width = 79, wrap = 'word') 
     vertscroll = ttk.Scrollbar(self.master) 
     vertscroll.config(command=self.textbox.yview) 
     self.textbox.config(yscrollcommand=vertscroll.set) 
     self.textbox.grid(column=0, row=0) 
     vertscroll.grid(column=1, row=0, sticky='NS') 

root = tk.Tk() 
app = App(root) 
root.mainloop() 
+0

Grazie! Tuttavia, non dovrebbe essere NSE appiccicoso? – user3623888

+0

Si potrebbe usare 'NSE', ma in questo caso non penso che importi. – unutbu

1

Il motivo del codice è semplice, non è possibile utilizzare confezione e la griglia all'interno della stessa classe o per lo stesso telaio. Quindi, usa solo uno.

+0

Perché "solo uno in tutto il codice"? Ognuno ha uno scopo, punti di forza e punti deboli. Le interfacce grafiche più complesse saranno più facili da scrivere quando si utilizzano entrambi. –

+0

È possibile avere "entrambi in tutto il codice". Quando si crea una GUI complessa, si utilizzano molte classi (che si ereditano dalla classe principale App.e.). Ognuna di queste classi ha i propri set di widget. Pertanto, è possibile utilizzare il pacchetto in alcune classi e la griglia in alcuni dividendo i componenti. –

+0

Sì, lo so. Quello che stavo chiedendo è il motivo per cui raccomandi di usarne solo uno in tutto il codice. –

Problemi correlati