2011-09-29 90 views
26

Tôi đang cố gắng tạo một mạng lưới các nút (để đạt được hiệu ứng ô có thể nhấp) với Tkinter.Làm thế nào để tạo ra một lưới tự thay đổi kích thước của các nút trong tkinter?

Vấn đề chính của tôi là tôi không thể thực hiện grid và các nút tự động và phù hợp với cửa sổ chính.

Ví dụ: khi tôi có số lượng nút lớn trên lưới, thay vì thu hẹp các nút sao cho lưới vừa với cửa sổ, tôi sẽ có khung kéo dài tắt màn hình.

Hiệu ứng mà tôi đang tìm kiếm là lưới điền tất cả không gian có sẵn, sau đó thay đổi kích thước ô của nó để vừa với không gian đó. Tôi đã đọc tài liệu, nhưng tôi vẫn không thể tìm ra cách để nó hoạt động.

Đây là mã cơ bản đó là điểm khởi đầu của tôi:

def __init__(self): 
    root = Tk() 
    frame = Frame(root) 
    frame.grid() 

    #some widgets get added in the first 6 rows of the frame's grid   

    #initialize grid 
    grid = Frame(frame) 
    grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2) 

    #example values 
    for x in range(60): 
     for y in range(30): 
      btn = Button(grid) 
      btn.grid(column=x, row=y) 

    root.mainloop() 

Trả lời

39

Bạn cần phải cấu hình các hàng và cột để có một cân khác không để họ sẽ đưa lên không gian thêm:

for x in range(60): 
    Grid.columnconfigure(grid, x, weight=1) 

for y in range(30): 
    Grid.rowconfigure(grid, y, weight=1) 

bạn cũng cần phải cấu hình các nút của bạn để họ sẽ mở rộng để điền vào các tế bào:

btn.grid(column=x, row=y, sticky=N+S+E+W) 

này phải được thực hiện tất cả các con đường lên, vì vậy đây là một ví dụ đầy đủ:

from tkinter import * 

root = Tk() 
frame=Frame(root) 
Grid.rowconfigure(root, 0, weight=1) 
Grid.columnconfigure(root, 0, weight=1) 
frame.grid(row=0, column=0, sticky=N+S+E+W) 
grid=Frame(frame) 
grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2) 
Grid.rowconfigure(frame, 7, weight=1) 
Grid.columnconfigure(frame, 0, weight=1) 

#example values 
for x in range(10): 
    for y in range(5): 
     btn = Button(frame) 
     btn.grid(column=x, row=y, sticky=N+S+E+W) 

for x in range(10): 
    Grid.columnconfigure(frame, x, weight=1) 

for y in range(5): 
    Grid.rowconfigure(frame, y, weight=1) 

root.mainloop() 
+1

Cảm ơn! Điều đó làm việc tuyệt vời. Tôi không chắc tại sao tôi không tìm thấy lớp Grid. Tôi đã đọc vào tài liệu quản lý hình học, nhưng chỉ phát hiện ra phương thức .grid. – Kiril

+1

Ví dụ của bạn không có các nút mở rộng khi bạn thay đổi kích thước trên hệ thống của tôi. Tôi đang sử dụng Xubuntu 14.04, 32 bit. Tôi đã thử nó trên cả Python 2.x và 3.x. – Shule

+0

Ví dụ rất hữu ích. @Kiril - bạn cũng có thể gọi columnconfigure từ tham chiếu đối tượng, ví dụ: root.rowconfigure (0, weight = 1) – NargothBond

2

Để làm cho các nút mở rộng khi cửa sổ là tối đa, cố gắng sửa đổi mục button.grid như sau :

btn.grid(column=x, row=y, sticky=N+S+E+W) 
7

@Vaughn Cato gave an excellent answer here. Tuy nhiên, ông đã vô tình bao gồm một loạt các mã không liên quan trong ví dụ của mình. Đây là một ví dụ đầy đủ được làm sạch và có tổ chức hơn, làm chính xác những gì mà ví dụ của anh ấy làm.

from tkinter import * 

#Create & Configure root 
root = Tk() 
Grid.rowconfigure(root, 0, weight=1) 
Grid.columnconfigure(root, 0, weight=1) 

#Create & Configure frame 
frame=Frame(root) 
frame.grid(row=0, column=0, sticky=N+S+E+W) 

#Create a 5x10 (rows x columns) grid of buttons inside the frame 
for row_index in range(5): 
    Grid.rowconfigure(frame, row_index, weight=1) 
    for col_index in range(10): 
     Grid.columnconfigure(frame, col_index, weight=1) 
     btn = Button(frame) #create a button inside frame 
     btn.grid(row=row_index, column=col_index, sticky=N+S+E+W) 

root.mainloop() 

Ảnh chụp màn hình:

Khi lần đầu tiên mở ra (nhỏ):

enter image description here

Sau khi bạn phóng to cửa sổ:

enter image description here