2016-04-14 3 views
0

Ich möchte herausfinden, welche Checkbuttons nach dem Schließen der Anwendung überprüft wurden. Wenn ich Checkbuttons Werte in einer Sammlung speichern, ist es nicht möglich, Zugriff auf diese Sammlung zu haben, nachdem die Anwendung zerstört wurde.python get checkbutton value nach Ende des Mainloops

app = Application(path_to_files) 
app.initialize(data) 
app.mainloop() 
#i want to know all checkbuttons values on this line 

checkerGUI.py

import Tkinter as tk 
import tkFont 
import webbrowser 
import os 
from PIL import ImageTk, Image 
import ctypes 

class Application(tk.Frame): 

    def __init__(self, pwd="", master=None): 
     tk.Frame.__init__(self, master) 
     self.initImages(pwd) 
     self.master.resizable(width=False, height=False) 
     self.index = 0 
     self.master.bind("<Return>", self.close) 
     self.grid() 
     self.games = [] 
     self.gamesHiddenFlags = {} 

    def close(self, event): 
     self.master.destroy() 

    def getGamesHiddenFlags(self): 
     return self.gamesHiddenFlags 

    def initialize(self, games): 
     self.games = games 
     for game in self.games: 
      self.gamesHiddenFlags[game.name] = tk.BooleanVar() 
      self.createWidgetsFromGame(game, self.gamesHiddenFlags[game.name]) 

    def initImages(self, path): 
     self.images = {} 
     buf = Image.open(os.path.join(path, "images", "Classic.png")) 
     buf = buf.resize((20, 20), Image.ANTIALIAS) # The (250, 250) is (height, width) 
     self.images['Classic'] = ImageTk.PhotoImage(buf) 

     buf = Image.open(os.path.join(path, "images", "Jeopardy.png")) 
     buf = buf.resize((20, 20), Image.ANTIALIAS) 
     self.images['Jeopardy'] = ImageTk.PhotoImage(buf) 

     buf = Image.open(os.path.join(path, "images", "On-site.png")) 
     buf = buf.resize((20, 20), Image.ANTIALIAS) 
     self.images['On-site'] = ImageTk.PhotoImage(buf) 

     buf = Image.open(os.path.join(path, "images", "On-line.png")) 
     buf = buf.resize((20, 20), Image.ANTIALIAS) 
     self.images['On-line'] = ImageTk.PhotoImage(buf) 

    def google_link_callback(event, site): 
     webbrowser.open_new(site) 

    def ShowImages(self, frame_in, type_img, place_img): 
     type_img = type_img.replace("Attack-Defense", "Classic").replace("Attack", "Classic") 
     type_img = type_img.replace("Hack quest", "Jeopardy") 
     label = tk.Label(frame_in, image=self.images[type_img]) 
     label.pack(side="right") 

     label = tk.Label(frame_in, image=self.images[place_img]) 
     label.pack(side="right") 

    def createWidgetsFromGame(self, game, flag): 
     frame = tk.Frame(self, relief='sunken') 
     frame.grid(row=0, column=self.index, sticky="WN") 
     frame_in = tk.Frame(frame) 
     frame_in.grid(row=0, sticky="WE", column=self.index) 

     header = tk.Label(frame_in, anchor="nw", justify="left", text="Игра: ") 
     header.pack(expand=True, fill="x", side="left") 

     self.ShowImages(frame_in, game.type, game.place_type) 

     header = tk.Label(frame, anchor="nw", justify="left", text="Состояние: ") 
     header.grid(row=1, sticky="WE", column=self.index) 

     header = tk.Label(frame, anchor='nw', justify="left", text="Дата проведения: ", height=2) 
     header.grid(row=3, sticky="WEN", column=self.index) 

     header = tk.Label(frame, anchor="nw", justify="left", text="Продолжительность: ") 
     header.grid(row=5, sticky="WE", column=self.index) 

     header = tk.Label(frame, anchor="nw", justify="left", text="Сайт игры: ") 
     header.grid(row=6, sticky="WE", column=self.index) 

     header = tk.Label(frame, anchor="nw", justify="left", text="Ранг: ") 
     header.grid(row=7, sticky="WE", column=self.index) 

     header = tk.Checkbutton(frame, text="Не показывать: ", variable=flag) # There is variable 
     header.grid(row=8, sticky="WE", column=self.index) 

     self.index += 1 

     frame2 = tk.Frame(self, relief='sunken') 
     frame2.grid(row=0, column=self.index, sticky="WN") 

     header = tk.Label(frame2, anchor="nw", justify="left", text=game.name) 
     header.grid(row=0, sticky="WE", column=self.index) 

     header = tk.Label(frame2, anchor="nw", justify="left", text=game.state) 
     header.grid(row=1, sticky="WE", column=self.index) 

     header = tk.Label(frame2, anchor="nw", justify="left", text=game.date['start'].strftime("с %d %B в %H:%M")) 
     header.grid(row=2, sticky="WE", column=self.index) 

     header = tk.Label(frame2, anchor="nw", justify="left", text=game.date['end'].strftime("до %d %B в %H:%M")) 
     header.grid(row=3, sticky="WE", column=self.index) 

     header = tk.Label(frame2, anchor="nw", justify="left", text="%d дней %d часов" % (game.duration['days'], game.duration['hours'])) 
     header.grid(row=4, sticky="WE", column=self.index) 

     header = tk.Label(frame2, anchor="nw", justify="left", fg='blue', font=tkFont.Font(underline=1, size=10), cursor="hand2", text=game.site) 
     header.bind("<Button-1>", lambda e: self.google_link_callback(game.site)) 
     header.grid(row=5, sticky="WE", column=self.index) 

     header = tk.Label(frame2, anchor="nw", justify="left", text=game.rank) 
     header.grid(row=6, sticky="WE", column=self.index) 

     self.index += 1 
+2

Es gibt in der Regel keine Notwendigkeit, dies zu tun, aber wenn Sie wirklich brauchen, um eine Funktion namens haben kann, wenn ein Check-Button aktualisiert wird und die Werte in einer Variablen zu speichern. – RobertR

+0

Wenn jemand bessere Lösung kennt, poste es bitte – gek0n

Antwort

1

OK, modifizierte ich Ihren Code ein bisschen. Sie finden Erklärungen als Kommentare innerhalb des Codes. Ich habe die Protokollmethode (die Sie mit self.master.protocol aufrufen können) hinzugefügt und die close-Methode geändert, so dass sie die Anwendung durchläuft, bevor sie die Anwendung löscht und die Flags in einem Verzeichnis sammelt, das dann in eine globale Liste konvertiert wird.

Um es zu testen, musste ich den Bildteil Ihres Codes auskommentieren und meine eigene Spielklasse erstellen, um eine Liste mit gefälschten Spielen zu erhalten.
Ich weiß nicht, ob meine Lösung elegant ist, aber unter meinen Testbedingungen hat es funktioniert.

So nach app.mainloop() versuchen Sie print(out), die Ihnen eine Liste von Nullen und Einsen geben wird.

Ich hoffe, es hilft. Ah, und bitte überprüfen Sie den Einzug! Dieser Editor hat hier etwas seltsames gemacht, als ich meinen Code eingefügt habe.


import Tkinter as tk 
import tkFont 
import webbrowser 
import os 
from PIL import ImageTk, Image 
import ctypes

class Application(tk.Frame):

def __init__(self, pwd="", master=None): tk.Frame.__init__(self, master) self.initImages(pwd) self.master.resizable(width=False, height=False) self.index = 0 self.master.bind("<Return>", self.close_by_keyboard)#changed self.master.protocol("WM_DELETE_WINDOW", self.close_by_mouse)#added self.grid() self.games = [] self.gamesHiddenFlags = {} self.flags = {} #collection of flags global out #variable will exist after Application object is destroyed out = [] #List of flags for later use #get the variable and exit in case you are closing with a mouse click: def close_by_mouse(self): self.get_variables() self.master.destroy() #same as above for closing with return key: def close_by_keyboard(self, event): self.get_variables() self.master.destroy() def get_variables(self): for i in self.flags: out.append(self.flags[i].get()) def getGamesHiddenFlags(self): return self.gamesHiddenFlags def initialize(self, games): self.games = games for game in self.games: self.gamesHiddenFlags[game.name] = tk.BooleanVar() self.createWidgetsFromGame(game, self.gamesHiddenFlags[game.name]) def initImages(self, path): self.images = {} buf = Image.open(os.path.join(path, "images", "Classic.png")) buf = buf.resize((20, 20), Image.ANTIALIAS) # The (250, 250) is (height, width) self.images['Classic'] = ImageTk.PhotoImage(buf) buf = Image.open(os.path.join(path, "images", "Jeopardy.png")) buf = buf.resize((20, 20), Image.ANTIALIAS) self.images['Jeopardy'] = ImageTk.PhotoImage(buf) buf = Image.open(os.path.join(path, "images", "On-site.png")) buf = buf.resize((20, 20), Image.ANTIALIAS) self.images['On-site'] = ImageTk.PhotoImage(buf) buf = Image.open(os.path.join(path, "images", "On-line.png")) buf = buf.resize((20, 20), Image.ANTIALIAS) self.images['On-line'] = ImageTk.PhotoImage(buf) def google_link_callback(event, site): webbrowser.open_new(site) def ShowImages(self, frame_in, type_img, place_img): type_img = type_img.replace("Attack-Defense", "Classic").replace("Attack", "Classic") type_img = type_img.replace("Hack quest", "Jeopardy") label = tk.Label(frame_in, image=self.images[type_img]) label.pack(side="right") label = tk.Label(frame_in, image=self.images[place_img]) label.pack(side="right") def createWidgetsFromGame(self, game, flag): frame = tk.Frame(self, relief='sunken') frame.grid(row=0, column=self.index, sticky="WN") frame_in = tk.Frame(frame) frame_in.grid(row=0, sticky="WE", column=self.index) header = tk.Label(frame_in, anchor="nw", justify="left", text="Игра: ") header.pack(expand=True, fill="x", side="left") self.ShowImages(frame_in, game.type, game.place_type) header = tk.Label(frame, anchor="nw", justify="left", text="Состояние: ") header.grid(row=1, sticky="WE", column=self.index) header = tk.Label(frame, anchor='nw', justify="left", text="Дата проведения: ", height=2) header.grid(row=3, sticky="WEN", column=self.index) header = tk.Label(frame, anchor="nw", justify="left", text="Продолжительность: ") header.grid(row=5, sticky="WE", column=self.index) header = tk.Label(frame, anchor="nw", justify="left", text="Сайт игры: ") header.grid(row=6, sticky="WE", column=self.index) header = tk.Label(frame, anchor="nw", justify="left", text="Ранг: ") header.grid(row=7, sticky="WE", column=self.index) self.flags[self.index]=tk.IntVar() header = tk.Checkbutton(frame, text="Не показывать: ", variable=self.flags[self.index]) # There is variable header.grid(row=8, sticky="WE", column=self.index) self.index += 1 frame2 = tk.Frame(self, relief='sunken') frame2.grid(row=0, column=self.index, sticky="WN") header = tk.Label(frame2, anchor="nw", justify="left", text=game.name) header.grid(row=0, sticky="WE", column=self.index) header = tk.Label(frame2, anchor="nw", justify="left", text=game.state) header.grid(row=1, sticky="WE", column=self.index) header = tk.Label(frame2, anchor="nw", justify="left", text=game.date['start'].strftime("с %d %B в %H:%M")) header.grid(row=2, sticky="WE", column=self.index) header = tk.Label(frame2, anchor="nw", justify="left", text=game.date['end'].strftime("до %d %B в %H:%M")) header.grid(row=3, sticky="WE", column=self.index) header = tk.Label(frame2, anchor="nw", justify="left", text="%d дней %d часов" % (game.duration['days'], game.duration['hours'])) header.grid(row=4, sticky="WE", column=self.index) header = tk.Label(frame2, anchor="nw", justify="left", fg='blue', font=tkFont.Font(underline=1, size=10), cursor="hand2", text=game.site) header.bind("<Button-1>", lambda e: self.google_link_callback(game.site)) header.grid(row=5, sticky="WE", column=self.index) header = tk.Label(frame2, anchor="nw", justify="left", text=game.rank) header.grid(row=6, sticky="WE", column=self.index) self.index += 1</pre></code>
+0

Ich benutze 'Application()' nicht 'Tk()', so Python sagt, es gibt keine 'protocol()' Methode. Und ich benutze meine Form als die Nachrichtenbox, aber mit anderem Inhalt. Also muss ich jedes Mal einen Rückgabewert haben, wenn es zerstört wird. – gek0n

+0

Könnten Sie einfach mehr von Ihrem Code posten? Welche Module haben Sie importiert? Ich dachte "Application()" war eine von dir geschriebene Klasse ?! – JosefScript

+0

Ich habe Code von 'Application' hinzugefügt – gek0n