2014-05-10 17 views
5

Vì vậy, tôi đang tạo một trình đọc rss bằng thư viện tkinter và trong một trong các phương pháp của tôi, tôi tạo một tiện ích văn bản. Nó hiển thị tốt cho đến khi tôi cố gắng thêm thanh cuộn vào nó.Không thể sử dụng gói trình quản lý hình học bên trong

Đây là mã của tôi trước khi cuộn:

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

Đây là mã của tôi sau:

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) 

này mang lại cho tôi những lỗi

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

Bất kỳ ý tưởng làm thế nào để sửa lỗi này ?

Trả lời

10

mỗi the docs, không pha trộn packgrid trong cửa sổ cùng một chủ:

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.

Vì vậy, nếu bạn gọi grid trên textbox, đừng gọi pack trên thanh trượt.


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

Cảm ơn! Chẳng lẽ cái dính không phải là NSE sao? – user3623888

+0

Bạn có thể sử dụng 'NSE', nhưng trong trường hợp này tôi không nghĩ rằng nó quan trọng. – unutbu

1

Lý do của mã này là đơn giản, bạn KHÔNG THỂ sử dụng gói và lưới bên trong cùng lớp hoặc cho cùng một khung. Vì vậy, chỉ sử dụng một.

+0

Tại sao "chỉ một mã trong toàn bộ mã"? Mỗi người đều có một mục đích, và điểm mạnh và điểm yếu. Hầu hết các GUI phức tạp sẽ dễ viết hơn khi bạn sử dụng cả hai. –

+0

Có thể có "cả trong suốt mã". Khi bạn tạo một GUI phức tạp, bạn sử dụng nhiều lớp (kế thừa từ lớp chính, tức là App). Mỗi lớp trong số này có bộ tiện ích con riêng. Vì vậy, bạn có thể sử dụng gói trong một số lớp và lưới trong một số bằng cách chia các thành phần. –

+0

Vâng, tôi biết điều đó. Những gì tôi đã hỏi là lý do tại sao bạn khuyên bạn nên chỉ sử dụng một trong suốt mã. –

Các vấn đề liên quan