2012-03-05 38 views
5

Tôi đang cố gắng xuất nội dung của cơ sở dữ liệu sang tiện ích Tkinter. Cơ sở dữ liệu có đủ hàng và cột để tôi cần có cả thanh cuộn ngang và dọc, nhưng tôi gặp khó khăn khi cuộn ngang và dọc để hoạt động đồng thời. Tôi thuyết bất khả tri về những Tkinter phụ tùng được sử dụng nhưng đây là thực hiện hiện tại của tôi:Thanh cuộn dọc và ngang trên tiện ích Tkinter

# 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')) 

Thực hiện điều này, tôi chỉ có thể được di chuyển để làm việc theo một hướng, tùy thuộc vào cách tôi gói vải:

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 

Tôi chỉ cần cuộn ngang và dọc để hoạt động đồng thời hoặc tìm giải pháp thay thế.

+0

[Ví dụ cuộn] (http://www.tkdocs.com/tutorial/canvas.html#scrolling) từ hướng dẫn hoạt động như mong đợi (nhập phải được sửa đổi cho Python 2.x). – jfs

Trả lời

8

Tôi không thấy bất kỳ mã nào có thể ngăn thanh cuộn hoạt động. Tôi thấy một vấn đề ngăn cản một trong các thanh cuộn hiển thị nơi bạn mong đợi nó (giả sử bạn mong đợi chúng xuất hiện ở nơi truyền thống). Đó có phải là điều bạn muốn nói là bạn muốn bạn "làm việc đồng thời" không?

bố trí của bạn được thực hiện với đoạn mã sau và theo trình tự sau:

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

Đó dòng đầu tiên làm cho vải để lấp đầy toàn bộ đầu tiện ích, tất cả các cách từ trái sang tất cả các cách rẽ phải. Khi sau đó bạn đặt thanh công cụ ở bên phải, điều này có nghĩa là nó chuyển sang bên phải của khoảng trống còn lại trên sau khi canvas tô đầy lên trên cùng. Kể từ khi canvas lấp đầy đầu, không có trái qua không gian bên phải, chỉ dưới đây. Do đó, thanh cuộn của bạn sẽ xuất hiện dưới dạng một tiện ích nhỏ về chiều cao của thanh cuộn ngang bên dưới canvas.

Khắc phục nhanh là đóng gói thanh cuộn dọc trước, sau đó là ngang và rồi canvas. Tiện ích "chính" của bạn phải luôn là một trong những thứ cuối cùng bạn đóng gói/lưới. Một, bạn làm điều đó vì lý do rõ ràng mà bạn cần trong trường hợp này để có được hiệu ứng mong muốn, nhưng cũng bởi vì nó làm cho hành vi thay đổi kích thước của bạn đúng. Tôi đang rời khỏi chủ đề để giải thích tại sao trong câu trả lời này, vì vậy hãy đọc this answer on stackoverflow để biết thêm thông tin.

Thứ hai, khi làm việc với thanh cuộn, tốt nhất là sử dụng lưới nếu bạn muốn có giao diện chuyên nghiệp. Nếu bạn sử dụng gói, thanh cuộn sẽ không căn chỉnh thuộc tính ở góc mà chúng gặp nhau. Bạn muốn họ trông như thế này, với một không gian trống nhỏ ở góc dưới bên phải:

|| 
== 

Tuy nhiên, nếu bạn sử dụng gói họ sẽ trông giống như một trong những:

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

Cuối cùng , Tôi khuyến khích bạn không phảiimport *, điều này có thể gây ra sự cố trên đường. Thay vào đó, hãy thực hiện thói quen làm import Tkinter as tk và sau đó đặt trước tất cả các lệnh tk bằng "tk". (ví dụ: tk.Canvas, v.v.) Bạn sẽ thấy lý do tại sao điều này quan trọng trong lần đầu tiên bạn cố trộn các tiện ích ttk và tkinter trong cùng một giao diện người dùng, nhưng bạn có thể gặp vấn đề ở nơi khác nếu bạn cũng "nhập *" từ các gói khác. Thêm vào đó, theo cách này, rõ ràng là bạn đang sử dụng các tính năng tk và khi bạn đang sử dụng các tính năng từ các gói khác.

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