【问题标题】:Hiding tkinter checkboxes隐藏 tkinter 复选框
【发布时间】:2019-08-20 11:45:05
【问题描述】:

我是 tkinter 的新手,正在学习基础知识。

以下代码打开一个 GUI 并提供两组复选框。

我希望隐藏第二组复选框。

只有当我从第一组复选框中单击 Python 时,才能看到 Python 2 和 Python 3。

from tkinter import *
class Checkbar(Frame):
   def __init__(self, parent=None, picks=[], side=LEFT, anchor=W):
      Frame.__init__(self, parent)
      self.vars = []
      for pick in picks:
         var = IntVar()
         chk = Checkbutton(self, text=pick, variable=var)
         chk.pack(side=side, anchor=anchor, expand=YES)
         self.vars.append(var)
   def state(self):
      return map((lambda var: var.get()), self.vars)
if __name__ == '__main__':
   root = Tk()
   lng = Checkbar(root, ['Python', 'Ruby', 'Perl', 'C++'])
   tgl = Checkbar(root, ['Python 2','Python 3'])
   #tgl = Checkbar(root, ['Ruby 2','Ruby 3'])
   #tgl = Checkbar(root, ['Perl 2','Perl 3'])
   #tgl = Checkbar(root, ['C++ 2','C++ 3'])
   lng.pack(side=TOP,  fill=X)
   tgl.pack(side=LEFT)
   lng.config(relief=GROOVE, bd=2)

   def allstates(): 
      print(list(lng.state()), list(tgl.state()))
   Button(root, text='Quit', command=root.quit).pack(side=RIGHT)
   Button(root, text='Peek', command=allstates).pack(side=RIGHT)
   root.mainloop()

【问题讨论】:

    标签: python tkinter widget


    【解决方案1】:

    也许这样的事情可能会对你有所帮助,当按下 peek 并且 Python 复选框处于活动状态时,会显示 Checkbar。只需使用 pack_forget() 将其隐藏并在您希望它显示时再次使用 pack():

    from tkinter import *
    class Checkbar(Frame):
       def __init__(self, parent=None, picks=[], side=LEFT, anchor=W):
          Frame.__init__(self, parent)
          self.vars = []
          for pick in picks:
             var = IntVar()
             chk = Checkbutton(self, text=pick, variable=var, command=self.foo)
             chk.pack(side=side, anchor=anchor, expand=YES)
             self.vars.append(var)
       def state(self):
          return map((lambda var: var.get()), self.vars)
    
    
       def foo(self):
        temp = [str(x) for x in lng.state()]
    
        if temp[0] == "1":
            tgl.pack(side=LEFT)
            lng.pack(side=TOP,  fill=X)
            lng.config(relief=GROOVE, bd=2)
    
        if temp[1] == "1":
    
            lng2.pack(side=TOP,  fill=X)
            lng.config(relief=GROOVE, bd=2)
    
    
        if temp[2] == "1":
    
            lng3.pack(side=TOP,  fill=X)
            lng.config(relief=GROOVE, bd=2)
    
        if temp[3] == "1":
    
            lng4.pack(side=TOP,  fill=X)
            lng.config(relief=GROOVE, bd=2)
    
    if __name__ == '__main__':
       root = Tk()
       lng = Checkbar(root, ['Python', 'Ruby', 'Perl', 'C++'])
       tgl = Checkbar(root, ['Python 2','Python 3'])
       lng2 = Checkbar(root, ['Ruby 2','Ruby 3'])
       lng3 = Checkbar(root, ['Perl 2','Perl 3'])
       lng4 = Checkbar(root, ['C++ 2','C++ 3'])
       lng.pack(side=TOP,  fill=X)
       lng2.pack(side=TOP,  fill=X)
       lng2.pack_forget()
       lng3.pack(side=TOP,  fill=X)
       lng3.pack_forget()
       lng4.pack(side=TOP,  fill=X)
       lng4.pack_forget()
    
       tgl.pack(side=LEFT)
       tgl.pack_forget()
    
       lng.config(relief=GROOVE, bd=2)
       lng2.config(relief=GROOVE, bd=2)
       lng3.config(relief=GROOVE, bd=2)
       lng4.config(relief=GROOVE, bd=2)
    
    
    
       def allstates(): 
          temp = [str(x) for x in lng.state()]
    
          if temp[0] == "1":
            tgl.pack(side=LEFT)
            lng.pack(side=TOP,  fill=X)
            lng.config(relief=GROOVE, bd=2)
    
    
    
       Button(root, text='Quit', command=root.quit).pack(side=RIGHT)
       Button(root, text='Peek', command=allstates).pack(side=RIGHT)
       root.mainloop()
    

    【讨论】:

    • 谢谢。是否可以在不需要检查 Peek 的情况下动态显示它?选择 Python 后,它应该显示 Python2 Python3。同样选择 Ruby 后,它应该显示 Ruby 2 Ruby 3(代码中的注释部分)
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多