web-dev-qa-db-ja.com

Tkinterでは、ウィジェットを非表示にする方法はありますか?

このようなものは、ウィジェットを正常に表示します:

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

このようなことをすると、ウィジェットはまったく表示されなくなります。

Label(self, text = 'hello', visible ='no') 
32
rectangletangle

pack_forget および grid_forget ウィジェットのメソッド。次の例では、ボタンをクリックするとボタンが消えます

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()
49
luc

別の回答で説明したように、1つのオプションはpack_forgetまたはgrid_forget。別のオプションは、liftlowerを使用することです。これにより、ウィジェットのスタック順序が変更されます。最終的な効果は、兄弟ウィジェット(または兄弟の子孫)の背後にウィジェットを非表示にできることです。それらを表示したい場合はliftそれら、そして非表示にしたい場合はlowerそれらです。

利点(または欠点...)は、マスターのスペースを占有することです。ウィジェットを「忘れる」と、他のウィジェットはサイズや向きを再調整する可能性がありますが、上下させると調整されません。

以下に簡単な例を示します。

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()
27
Bryan Oakley

私はこれが数年遅れていることを知っていますが、これは10/27/13の時点での「Tkinter hide Label」に対する3番目のGoogleの回答です... 「lower」または「lift」メソッドを介して別のウィジェットにテキストをスワップアウトせずに表示したい場合、使用する回避策を提供したいと思います(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()

ここでのアイデアは、「。cget( 'bg')」を使用して親の背景( 'bg')に無効テキストの色を設定できることです http://effbot.org/tkinterbook/widget .htm 「不可視」にレンダリングします。ボタンコールバックは、ラベルをデフォルトの前景色にリセットし、テキストが再び表示されます。

ここでの欠点は、たとえテキストを読むことができなくても、まだテキスト用のスペースを割り当てる必要があることです。少なくとも私のコンピューターでは、テキストは背景に完全には溶けません。色を微調整する方が良いかもしれませんし、コンパクトなGUIの場合、空白スペースの割り当ては、短い宣伝文としてはそれほど面倒ではないはずです。

色に関する情報を見つけた方法については、 デフォルトのウィンドウカラーTkinterおよび16進カラーコード を参照してください。

4
WellThatBrokeIt

ウィジェットを非表示にするには、関数pack_forget()を使用し、再び表示するには、pack()関数を使用して、両方を別々の関数に実装します。

from Tkinter import *
root = Tk()
label=Label(root,text="I was Hidden")
def labelactive():
    label.pack()
def labeldeactive():
    label.pack_forget()
Button(root,text="Show",command=labelactive).pack()
Button(root,text="Hide",command=labeldeactive).pack()
root.mainloop()
1
Saheb Singh

OOP私のように嫌いな人のために(これはブライアンオークリーの答えに基づいています)

import tkinter as tk

def show_label():
    label1.lift()

def hide_label():
    label1.lower()

root = tk.Tk()
frame1 = tk.Frame(root)
frame1.pack()

label1 = tk.Label(root, text="Hello, world")
label1.pack(in_=frame1)

button1 = tk.Button(root, text="Click to hide label",command=hide_label)
button2 = tk.Button(root, text="Click to show label", command=show_label)
button1.pack(in_=frame1)
button2.pack(in_=frame1)

root.mainloop()
0
bemygon