2012-06-15 48 views
6

Tôi đang tìm cách tạo ra một cái gì đó tương tự như một bảng trong Tkinter nhưng nó không nhất thiết phải là một.Tạo một bảng trông giống như Tkinter

Tôi muốn tạo tiêu đề 'Name1', 'Name2', 'Value' chẳng hạn và bên dưới mỗi cái tôi muốn có nhiều hàng trống.

Những hàng này sau đó tôi muốn điền vào sau (do đó là Nhãn) với các giá trị tôi đã tính hoặc giá trị chuỗi cho tên.

Đối với 'Name2' Tôi thực sự muốn toàn bộ cột là một trình đơn thả xuống. Tôi đã tạo mã cho riêng nó nhưng không chắc cách kết hợp nó vào 'bảng' này.

Ví dụ: có thể tạo đường viền xung quanh tiện ích Nhãn sao cho nó trông giống như 'bảng'?

Bất kỳ hướng dẫn nào về những gì có thể xảy ra trong tình huống này sẽ được đánh giá rất nhiều. Nếu bạn yêu cầu bất kỳ mã nào của tôi để có một cái gì đó đi, chỉ cần hỏi. Cảm ơn bạn!

+0

gì là sai với [TkTable] (http://tkinter.unpythonic.net/wiki/TkTable)? – Simon

+0

Tôi không thể tải xuống trên máy tính tôi đang sử dụng ... tất cả đều bị chặn! – user2063

+0

thậm chí http://tkinter.unpy.net/wiki/TkTableWrapper này? – Simon

Trả lời

31

Bạn đang gặp phải sự cố gì? Giải pháp đơn giản là bố trí các vật dụng bằng cách sử dụng grid. Bạn có thể đặt bất kỳ loại tiện ích nào bạn muốn trong mỗi ô. Và có, nhãn có thể có đường viền. Mặc dù, một cách đơn giản để làm các đường lưới là sử dụng một vùng đệm xung quanh mỗi ô, do đó màu của khung sẽ hiển thị thông qua các khoảng trống.

Thực hiện việc này trong khung. Nếu bạn cần để có thể di chuyển bảng, hãy đặt khung bên trong canvas và thêm thanh cuộn. Có các ví dụ trên web để biết cách tạo khung có thể cuộn bằng canvas.

Đây là ví dụ thực sự nhanh chóng chỉ sử dụng nhãn và không cuộn. Tôi sẽ để lại việc thực hiện chính xác những gì bạn cần như một bài tập cho người đọc.

import Tkinter as tk 

class ExampleApp(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     t = SimpleTable(self, 10,2) 
     t.pack(side="top", fill="x") 
     t.set(0,0,"Hello, world") 

class SimpleTable(tk.Frame): 
    def __init__(self, parent, rows=10, columns=2): 
     # use black background so it "peeks through" to 
     # form grid lines 
     tk.Frame.__init__(self, parent, background="black") 
     self._widgets = [] 
     for row in range(rows): 
      current_row = [] 
      for column in range(columns): 
       label = tk.Label(self, text="%s/%s" % (row, column), 
           borderwidth=0, width=10) 
       label.grid(row=row, column=column, sticky="nsew", padx=1, pady=1) 
       current_row.append(label) 
      self._widgets.append(current_row) 

     for column in range(columns): 
      self.grid_columnconfigure(column, weight=1) 


    def set(self, row, column, value): 
     widget = self._widgets[row][column] 
     widget.configure(text=value) 

if __name__ == "__main__": 
    app = ExampleApp() 
    app.mainloop() 
+0

Cảm ơn bạn, có vẻ tuyệt vời! – user2063

+0

Vấn đề duy nhất của tôi bây giờ là tôi chưa bao giờ thực sự sử dụng 'self' hay '__init__' nhiều và không hoàn toàn hiểu cách kết hợp các chức năng khác của tôi cho các menu vv. Bạn có thể cho tôi một số lời khuyên hay không !) xin vui lòng? – user2063

+0

Ví dụ, tôi thậm chí còn hơi bối rối về cách gán tên cho Frame ... nhưng tôi có chức năng để mở và menu, v.v. – user2063

2

Một giải pháp đối tượng ít khá đơn giản tôi thấy:

from Tkinter import * 

rows = [] 
for i in range(5): 
    cols = [] 
    for j in range(4): 
     e = Entry(relief=RIDGE) 
     e.grid(row=i, column=j, sticky=NSEW) 
     e.insert(END, '%d.%d' % (i, j)) 
     cols.append(e) 
    rows.append(cols) 

def onPress(): 
    for row in rows: 
     for col in row: 
      print col.get(), 
     print 

Button(text='Fetch', command=onPress).grid() 
mainloop() 

hoặc

# simple 2d table 

from Tkinter import * 

for i in range(5): 
    for j in range(4): 
     l = Label(text='%d.%d' % (i, j), relief=RIDGE) 
     l.grid(row=i, column=j, sticky=NSEW) 

mainloop() 

Tất cả có sẵn tại http://www.java2s.com/Code/Python/GUI-Tk/

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