2012-05-04 80 views
15

Hiểu biết của tôi là sau khi khởi tạo tất cả các khung và tiện ích trong phương thức __init__, cửa sổ tkinter sẽ thay đổi kích thước để phù hợp với tất cả các thành phần này.Làm cách nào để đặt kích thước cửa sổ tối thiểu trong tkinter?

Tôi muốn đặt kích thước được khởi tạo của cửa sổ thành kích thước tối thiểu. Tôi muốn có thể phóng to và mở rộng cửa sổ lớn hơn, nhưng tôi không bao giờ muốn cửa sổ đủ nhỏ để bắt đầu ẩn các tiện ích.

Làm cách nào để thực hiện việc này?

+0

Bạn có muốn hạn chế người dùng làm cửa sổ nhỏ hơn không? Bạn có nghĩa là có rất nhiều vật dụng mà một số có được cắt nhỏ ra, hoặc là một vấn đề bố trí nơi mọi thứ đang nhận được cắt nhỏ có lẽ không chính xác (tức là: một thanh cuộn biến mất chứ không phải là một widget văn bản thu hẹp)? –

Trả lời

27

Bạn cũng có thể buộc một bản cập nhật ngay lập tức mà không cần nhập mainloop của bạn, bằng cách sử dụng một cái gì đó như thế này:

root = Tk() 
# set up widgets here, do your grid/pack/place 
# root.geometry() will return '1x1+0+0' here 
root.update() 
# now root.geometry() returns valid size/placement 
root.minsize(root.winfo_width(), root.winfo_height()) 

Mô tả update() tại effbot tkinterbook:

Xử lý tất cả các sự kiện đang chờ xử lý, gọi lại gọi lại sự kiện, hoàn thành bất kỳnàoquản lý hình ảnh đang chờ xử lý, vẽ lại các tiện ích khi cần thiết và gọi tất cả các tác vụ chờ đang chờ xử lý. Phương pháp này nên được sử dụng cẩn thận, vì nó có thể dẫn đến các điều kiện chủng tộc thực sự khó chịu nếu được gọi từ sai địa chỉ (từ trong một sự kiện gọi lại, hoặc từ một hàm có thể được gọi từ một sự kiện gọi lại, v.v.). Thay vào đó, khi bạn nhập số , hãy sử dụng update_idletasks.

Tôi đã sử dụng điều này rất tốt trong khi đang cố gắng tìm cách làm những việc như nhận kích thước/vị trí tiện ích trước khi nhảy vào vòng lặp chính.

+0

Điều này sạch hơn nhiều so với câu trả lời của tôi. Cảm ơn! –

+0

Xin chào John chuyên gia về Python! Vui lòng xem http://stackoverflow.com/questions/23022005/python-tkinter-tree-selection –

2

I figured it out:

def __init__(self, master): 
    ... 
    self.master.update_idletasks() 
    self.master.after_idle(lambda: self.master.minsize(self.master.winfo_width(), self.master.winfo_height())) 
-3
root = Tk() 

Vì cửa sổ gốc được tạo. Cửa sổ gốc là một cửa sổ ứng dụng chính trong các chương trình của chúng tôi. Nó có một thanh tiêu đề và biên giới. Chúng được cung cấp bởi trình quản lý cửa sổ. Nó phải được tạo trước bất kỳ widget nào khác.

root.geometry("250x150+300+300") 

Các hình học() phương pháp thiết lập một kích thước cho cửa sổ và vị trí nó trên màn hình. Hai thông số đầu tiên là chiều rộng và chiều cao của cửa sổ. Hai tham số cuối cùng là tọa độ x, y.

app = Example(root) 

Ở đây chúng tôi tạo cá thể của lớp ứng dụng.

root.mainloop() 

Cuối cùng, chúng tôi nhập vòng lặp chính. Việc xử lý sự kiện bắt đầu từ thời điểm này. Mainloop nhận các sự kiện từ hệ thống cửa sổ và gửi chúng đến các widget ứng dụng. Nó được chấm dứt khi chúng ta nhấn vào nút đóng của thanh tiêu đề hoặc gọi phương thức quit().

enter image description here

Tôi hy vọng bạn thấy điều này hữu ích.

+0

Điều này dường như không trả lời được câu hỏi nào cả. Câu trả lời của bạn phải làm gì với việc thiết lập kích thước tối thiểu của một cửa sổ? –

+0

Không có chức năng ma thuật duy nhất nào để buộc khung ở mức tối thiểu hoặc cố định. Tuy nhiên, bạn chắc chắn có thể buộc kích thước của một khung bằng cách cho khung hình có chiều rộng và chiều cao. – miksiii

4

Tôi biết câu hỏi này là cũ, nhưng đây là một cách khác:

root = Tk() 
root.minsize(foo, bar) 

root.minsize() đặt kích thước tối thiểu của cửa sổ để foothanh, nơi foothanh là chiều rộng và chiều cao của cửa sổ, tương ứng.

Tuy nhiên, bạn phải đặt mã này trước vòng chính của mình.

+0

Điều đó không đúng khi bạn PHẢI đặt mã đó trước vòng lặp chính của bạn. –

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