How to hide a button by using a class function in python

时间:2015-11-12 11:33:58

标签: python tkinter

from tkinter import*

root = Tk()
shape = Canvas(root)

class GUI():
    def __init__(self):
        pass

    def create_button(self, info, boom, posit):
        self.Button(root)
        self.config(text=info)
        self.bind("<Button-1>",boom)
        self.grid(column=posit[0],row=posit[1])

    def create_label(self, info, posit):
        self.Label(root)
        self.config(text=info)
        self.grid(column=posit[0],row=posit[1])

    def go_away(self):
        print("GO AWAY before")
        self.button.grid_forget()
        print("GO AWAY")

def make_GUI():
    root.title("Hexahexaflexagon")

    hexahexa = GUI()

    quit_butt = GUI()
    quit_butt.create_button("Exit","root.destroy()",[0,1])

    quit_butt.go_away()

make_GUI()
root.mainloop()

Okay so I am trying to write a class function to just hide (and if not that then delete) a button created by tkinter, I'm new to classes and the error message I keep getting is that the GUI class does not have that function or that object does not have that attribute, I've tried code such as frm.forget(), .lower(), .grid_forget() but there not working for me.

The traceback is:

  Traceback (most recent call last):
    File "N:\HW\Hexahexaflexagon generator.py", line 94, in <module>
      make_GUI()
    File "N:\HW\Hexahexaflexagon generator.py", line 63, in make_GUI
      quit_butt.go_away()
    File "N:\HW\Hexahexaflexagon generator.py", line 51, in go_away
      self.button.grid_forget()
  AttributeError: 'function' object has no attribute 'grid_forget'

1 个答案:

答案 0 :(得分:0)

The problem is this line:

self = Button(root)

You are redefining self from referring to the current object, to now refer to a different object. You have the same problem further down with a label. This is simply not how python works.

You must store the widgets as attributes on self, not as self itself.

self.button = Button(root)
...
self.label = Label(root)

Once you do that, you can hide the button or label with grid_forget since you're using grid to make it visible:

self.button.grid_forget()

You have another problem in that you're passing in a command as a string. This will not work the way you think it does. If you want to be able to pass in a function, it needs to be a reference to an actual function:

quit_butt.button("Exit",root.destroy,[0,1])