'How to get instance attribute value and do logic based on that? Python, Tkinter
I have created a custom message box that returns True if the yes button is pressed and False if the no button is pressed. Now I want to do logic based on that in the init method of the class MainApp. How can I do this? How can I get the instance attribute value of answer from the class MessageboxYesNo? I am fairly new to OOP.
from sys import platform
import tkinter as tk
class MainApp(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent #save root window object here when instantiating from this class
self.set_app_size_and_position()
#Exit button
self.exitButton = tk.Button(self.parent, text="Exit", command=lambda: MessageboxYesNo(self, "QUIT", "Are you sure you want to quit?"), bg="red", fg="black")
self.exitButton.pack(side="top", anchor='ne', padx=15, pady=10)
#Want to do logic here based on the answer from the messagebox. How can I access the answer from the MessageboxYesNo class/instance?
# if answer:
# do something
def set_app_size_and_position(self):
# get screen width and height
self.screen_width = int(self.parent.winfo_screenwidth())
self.screen_height = int(self.parent.winfo_screenheight())
self.app_width_mac = int(self.screen_width/2)
self.app_height_mac = int(self.screen_height)
self.app_x_pos_mac = int(self.screen_width/2)
self.app_y_pos_mac = 0
#set the app window to half of the screens width and to the right side of the screen
if platform == "darwin":
self.parent.geometry(f"{self.app_width_mac}x{self.app_height_mac}+{self.app_x_pos_mac}+{self.app_y_pos_mac}")
class MessageboxYesNo(tk.Frame):
def __init__(self, parent, title, text):
tk.Frame.__init__(self, parent)
self.parent = parent #this will be root
self.title = title
self.text = text
self.answer = None
self.toplevel = tk.Toplevel(self.parent)
#get the messagebox on top of the app window
self.toplevel.focus_force() # Get focus
self.toplevel.title(self.title)
#set x- and y-coordinates for centering the messagebox
#self.parent.app_x_pos_mac will get the instance attribute value from the class MainApp
self.x_pos_messagebox = int(self.parent.app_x_pos_mac+(self.parent.app_x_pos_mac/2))
self.y_pos_messagebox = int(self.parent.app_height_mac/2)
#position the messagebox near the center of the app
self.toplevel.geometry(f"500x300+{self.x_pos_messagebox}+{self.y_pos_messagebox}")
#add labels and buttons to messagebox
self.l1=tk.Label(self.toplevel, image="::tk::icons::question")
self.l1.grid(row=0, column=0, pady=(7, 0), padx=(10, 30), sticky="e")
self.l2=tk.Label(self.toplevel,text=self.text)
self.l2.grid(row=0, column=1, columnspan=3, pady=(7, 10), sticky="w")
self.b1=tk.Button(self.toplevel,text="Yes",width = 10, command=lambda: self.answerMessagebox(True))
self.b1.grid(row=1, column=1, padx=(2, 35), sticky="e")
self.b2=tk.Button(self.toplevel,text="No", width = 10, command=lambda: self.answerMessagebox(False))
self.b2.grid(row=1, column=2, padx=(2, 35), sticky="e")
def answerMessagebox(self, answerOnQuestion):
if answerOnQuestion == True:
print("You pressed yes")
self.answer = True
if answerOnQuestion == False:
print("You pressed no")
self.answer = False
print(self.answer)
self.toplevel.destroy() #close messagebox
return self.answer
def main():
root = tk.Tk()
app = MainApp(root)
app.pack()
root.mainloop()
if __name__ == "__main__":
main()
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
