2010-05-04 29 views
7

Có thể đặt một mạng lưới các nút trong Tkinter bên trong khung khác không?Lưới trong khung?

Tôi muốn tạo trò chơi tương tự như trò chơi và muốn sử dụng tính năng lưới để đặt trò chơi trò chơi (đó sẽ là các nút). Tuy nhiên, tôi muốn có những thứ khác trong GUI ngoài bảng trò chơi vì vậy nó không lý tưởng để chỉ có mọi thứ trong một lưới.

Để minh họa:

O | X | X | 
---------- | 
O | O | X | Player 2 wins! 
---------- | 
X | O | X | 

Các tic tac toe board là trong một mạng lưới mà được tạo thành từ tất cả các nút và 'chơi 2 trận thắng' là một nhãn bên trong một khung.

Đây là sự đơn giản hóa những gì tôi đang cố gắng thực hiện với tôi, theo cách tôi đã thiết kế chương trình cho đến nay (bảng được tạo động) lưới có ý nghĩa nhất.

Chỉnh sửa: Đã có suy nghĩ nhưng khi tôi chạy nó, không có gì xảy ra? Nếu tôi đưa ra khung bit nó. Bất kỳ ý tưởng?

from Tkinter import * 

root = Tk() 

b = Button(root, text = "1") 
b.grid(row=1, column=3) 
b2 = Button(root, text = "2") 
b2.grid(row=1, column=4) 

f = Frame(root, bg = "red") 
f.pack(side=RIGHT) 

root.mainloop() 
+0

Lý do không có gì xảy ra là bạn đang sử dụng cả lưới và gói trong cùng một bậc cha mẹ (b.grid() và f.pack() đều ảnh hưởng đến tiện ích gốc). Điều này có thể gây ra tất cả các loại hành vi xấu. Trong một thùng chứa duy nhất bạn chỉ nên sử dụng một cái hoặc cái kia. Trong toàn bộ ứng dụng của bạn, bạn có thể kết hợp tất cả những gì bạn muốn miễn là bạn không sử dụng cả trực tiếp trong cùng một vùng chứa. –

Trả lời

7

đặn ra một cách để làm điều đó cuối cùng:

from Tkinter import * 

root = Tk() 

f = Frame(root, bg = "orange", width = 500, height = 500) 
f.pack(side=LEFT, expand = 1) 

f3 = Frame(f, bg = "red", width = 500) 
f3.pack(side=LEFT, expand = 1, pady = 50, padx = 50) 

f2 = Frame(root, bg = "black", height=100, width = 100) 
f2.pack(side=LEFT, fill = Y) 

b = Button(f2, text = "test") 
b.pack() 

b = Button(f3, text = "1", bg = "red") 
b.grid(row=1, column=3) 
b2 = Button(f3, text = "2") 
b2.grid(row=1, column=4) 
b3 = Button(f3, text = "2") 
b3.grid(row=2, column=0) 

root.mainloop() 

Có lưới bên trong một khung bên trong một khung là một chút của một hack để có được đệm xung quanh lưới làm việc nhưng nó hoạt động vì vậy tôi vui mừng.

+2

Lưới không phải là một "điều", nó là một phương thức mà các widget sử dụng để sắp xếp chúng trong một khung; lưu ý rằng không có 'Grid' được xây dựng.Đây là mô hình Tk của thành phần, nó tương tự như của TeX mà bản thân nó có nguồn gốc từ 500 năm kinh nghiệm in ấn. Hộp lồng nhau là phương pháp mà chúng tôi đã tìm thấy để sắp xếp các đối tượng giống như văn bản: nó không phải là một hack. – msw

+0

Câu trả lời tuyệt vời = đã giúp tôi với một vấn đề mà tôi đã phải vật lộn trong nhiều ngày. – xxmbabanexx

1

Bạn có thể lồng các tiện ích Tk tùy ý sâu. Quoth các manual:

Kích thước của bất kỳ phụ tùng tổng thể được xác định bởi kích thước của “nô lệ widget” bên trong. Người đóng gói được sử dụng để điều khiển nơi tiện ích con nô lệ xuất hiện bên trong trình chủ mà chúng được đóng gói. Bạn có thể đóng gói tiện ích vào các khung và khung thành các khung khác, để đạt được loại bố cục mà bạn mong muốn. Ngoài ra, sắp xếp được điều chỉnh động thành chứa các thay đổi gia tăng đối với cấu hình , sau khi được đóng gói.

Thật vậy, khung chứa (khung nút) và nhãn là cách bạn phải cấu trúc bố cục bạn mô tả.

+0

Bạn đang nói rằng những gì tôi yêu cầu là không thể? Tôi biết tôi có thể đặt khung trong một khung nhưng có thể đặt lưới trong khung không? – Sam

+1

@Sam: bạn không thể "đặt lưới trong khung" vì lưới không phải là thứ bạn có thể đặt bất kỳ. Phương thức grid() chỉ đơn thuần đặt các vật dụng trong một container. Bạn không phải là "thêm một lưới" bạn chỉ đơn thuần là "đặt vật dụng trong một mô hình lưới". Và, như câu trả lời cho biết, bạn có thể làm tổ các widget Tk tùy ý sâu (mặc dù trong nhiều năm kinh nghiệm của tôi, bạn hiếm khi cần phải đi sâu hơn 3 hoặc 4). –

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