2016-04-14 60 views
0

我想知道,在關閉應用程序後檢查了哪些checkbutton。 如果我在任何集合中保存checkbuttons值,那麼在應用程序被銷燬後不可能訪問該集合。python在主循環結束後得到checkbutton值

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

有通常不需要做這個,但如果你真的需要,你可以有一個無論何時檢查按鈕更新調用的函數,並保存在一個變量的值。 – RobertR

+0

如果有人知道更好的解決方案,請發帖 – gek0n

回答

1

OK,我修改您的代碼位。你會在代碼中找到註釋的解釋。 我添加了協議方法(您可以調用self.master.protocol)並更改了close方法,以便在它銷燬應用程序之前,它會遍歷checkbuttons並收集目錄中的標誌,然後轉換爲全局列表。

爲了測試它,我必須將代碼的圖像部分註釋掉,並創建我自己的遊戲類以獲得假遊戲列表。
不知道我的解決方案是否優雅,但在我的測試條件下工作。

所以在app.mainloop()之後嘗試print(out),它會給你一個零和一個列表。

希望它有幫助。 啊,請檢查一下!當我粘貼我的代碼時,這裏的編輯做了一些奇怪的事情。


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

我使用Application()而不是'Tk()',所以python說沒有'protocol()'方法。我使用我的表單作爲消息框,但內容不同。所以我每次銷燬時都需要返回值。 – gek0n

+0

你可以發佈更多的代碼嗎?你導入了哪些模塊?我以爲「Application()」是你自己寫的一個類?! – JosefScript

+0

我已添加'應用程序代碼' – gek0n