2010-09-29 142 views
25

Something như thế này, sẽ làm cho các widget xuất hiện thường:Trong Tkinter là có cách nào để làm cho một widget không hiển thị?

Label(self, text = 'hello', visible ='yes') 

Trong khi một cái gì đó như thế này, sẽ làm cho các phụ tùng không xuất hiện ở tất cả:

Label(self, text = 'hello', visible ='no') 
+0

Câu hỏi đặt ra, đó có phải là hành vi thích hợp không? – pyfunc

+0

@pyfunc Câu hỏi đặt ra trong chủ đề (dù có hay không ở đó nhưng không ở trong nội dung thư). – Shule

Trả lời

38

Bạn có thể quan tâm bởi pack_forgetgrid_forget phương pháp của một widget. Trong ví dụ sau, nút sẽ biến mất khi nhấp

from Tkinter import * 

def hide_me(event): 
    event.widget.pack_forget() 

root = Tk() 
btn=Button(root, text="Click") 
btn.bind('<Button-1>', hide_me) 
btn.pack() 
btn2=Button(root, text="Click too") 
btn2.bind('<Button-1>', hide_me) 
btn2.pack() 
root.mainloop() 
+22

'grid_remove' là một tùy chọn khác. Lợi thế của nó trên 'grid_forget' là lưới sẽ nhớ tất cả các tùy chọn, để một' grid() 'đơn giản sẽ đặt nó trở lại ngay. Không có 'pack_remove'. –

+0

@BryanOakley: [Here] (http://effbot.org/tkinterbook/pack.htm#Tkinter.Pack.pack_forget-method) nó nói rằng ngay cả 'pack()' cũng nhớ nó. – Gogo

+1

@shaktimaan: Tôi không nhìn thấy nơi nó nói rằng các tùy chọn được ghi nhớ. Nó có thể được hiển thị lại, nhưng nó có thể không được hiển thị lại trong cùng một vị trí. –

23

Một lựa chọn, như được giải thích trong câu trả lời khác, là sử dụng pack_forget hoặc grid_forget. Một tùy chọn khác là sử dụng liftlower. Điều này thay đổi thứ tự xếp chồng của các widget. Hiệu ứng ròng là bạn có thể ẩn các vật dụng đằng sau các tiện ích anh chị em (hoặc hậu duệ của anh chị em ruột). Khi bạn muốn chúng hiển thị, bạn lift chúng và khi bạn muốn chúng ẩn mặt bạn, hãy lower chúng.

Lợi thế (hoặc bất lợi ...) là chúng vẫn chiếm không gian trong chủ của chúng. Nếu bạn "quên" một tiện ích, các tiện ích con khác có thể điều chỉnh kích thước hoặc hướng của chúng, nhưng nếu bạn tăng hoặc giảm chúng thì chúng sẽ không.

Dưới đây là một ví dụ đơn giản:

import Tkinter as tk 

class SampleApp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     self.frame = tk.Frame(self) 
     self.frame.pack(side="top", fill="both", expand=True) 
     self.label = tk.Label(self, text="Hello, world") 
     button1 = tk.Button(self, text="Click to hide label", 
          command=self.hide_label) 
     button2 = tk.Button(self, text="Click to show label", 
          command=self.show_label) 
     self.label.pack(in_=self.frame) 
     button1.pack(in_=self.frame) 
     button2.pack(in_=self.frame) 

    def show_label(self, event=None): 
     self.label.lift(self.frame) 

    def hide_label(self, event=None): 
     self.label.lower(self.frame) 

if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 
+2

Tôi có thể sai, nhưng tôi không nghĩ rằng điều này hoạt động trong Python/Tkinter. Đoán từ việc bạn sử dụng 'raise()', là một từ dành riêng cho Python (nó được gọi là 'lift()'), tôi không nghĩ bạn sử dụng Python/Tkinter. – AndyL

+5

@AndyL: Tôi sử dụng tkinter khá nhiều trong những ngày này (khoảng năm 2011) và có khoảng 15 năm kinh nghiệm với tk mà dịch hơn độc đáo. Thành thật mà nói, tôi nghĩ rằng bạn đang sai về giải pháp này không làm việc nhưng tôi rất thích nghe lý do của bạn. Tại sao bạn nói bạn không nghĩ rằng nó hoạt động? Bạn có biết một trường hợp mà điều này là như vậy, hoặc là bạn đoán? Cảm ơn, bằng cách này, cho lời nhắc nhở về thang máy so với nâng cao. Đôi khi tôi quên rằng tkinter phải đi lạc từ api bản địa của tk để chứa cú pháp của python, và nâng là một lệnh mà tôi hiếm khi cần sử dụng. Tôi đã cập nhật câu trả lời của mình. –

+4

Sau khi đọc lại nhận xét của tôi, tôi muốn nói rằng tôi chắc chắn không có ý xúc phạm như tôi nghe. Lời xin lỗi của tôi. Tôi đã nhận xét ban đầu của tôi vì tôi đã thử giải pháp của bạn trước đây và không thể làm cho nó hoạt động cho tôi. Tôi đã nhận được một TclError bất cứ khi nào tôi đã cố gắng để giảm một phụ tùng phía sau cha mẹ của nó. Điều này rất có thể hình dung được một sai sót trên một phần của riêng tôi. Bạn có thể cung cấp mã để khai sáng cho tôi không? – AndyL

3

Tôi biết đây là một vài năm cuối, nhưng đây là phản ứng của Google 3rd bây giờ cho "Tkinter ẩn Label" như của 10/27/13 .. Vì vậy, nếu bất cứ ai như bản thân mình cách đây vài tuần là xây dựng một GUI đơn giản và chỉ muốn một số văn bản xuất hiện mà không cần trao đổi nó cho một tiện ích khác thông qua phương pháp "thấp hơn" hoặc "nâng", tôi muốn cung cấp một cách giải quyết. Python2.7, Windows):

from Tkinter import * 


class Top(Toplevel): 
    def __init__(self, parent, title = "How to Cheat and Hide Text"): 
     Toplevel.__init__(self,parent) 
     parent.geometry("250x250+100+150") 
     if title: 
      self.title(title) 
     parent.withdraw() 
     self.parent = parent 
     self.result = None 
     dialog = Frame(self) 
     self.initial_focus = self.dialog(dialog) 
     dialog.pack() 


    def dialog(self,parent): 

     self.parent = parent 

     self.L1 = Label(parent,text = "Hello, World!",state = DISABLED, disabledforeground = parent.cget('bg')) 
     self.L1.pack() 

     self.B1 = Button(parent, text = "Are You Alive???", command = self.hello) 
     self.B1.pack() 

    def hello(self): 
     self.L1['state']="normal" 


if __name__ == '__main__': 
    root=Tk() 
    ds = Top(root) 
    root.mainloop() 

Ý tưởng ở đây là bạn có thể đặt màu của văn bản DISABLED thành thứ e nền ('bg') của cha mẹ bằng cách sử dụng ".cget ('bg')" http://effbot.org/tkinterbook/widget.htm hiển thị nó "ẩn". Nút gọi lại đặt lại Nhãn cho màu nền trước mặc định và văn bản một lần nữa hiển thị.

Nhược điểm ở đây là bạn vẫn phải phân bổ không gian cho văn bản mặc dù bạn không đọc được, và ít nhất trên máy tính của tôi, văn bản không hòa trộn hoàn hảo với nền. Có lẽ với một số điều chỉnh màu sắc có thể được tốt hơn và cho GUI nhỏ gọn, phân bổ không gian trống không phải là quá nhiều rắc rối cho một blurb ngắn.

Xem Default window colour Tkinter and hex colour codes để biết thông tin về cách tôi tìm hiểu về màu sắc.

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