2016-04-14 13 views
0

Uygulama kapatıldıktan sonra hangi kontrollerin işaretlendiğini öğrenmek istiyorum. Herhangi bir koleksiyonda kontrol düğmeleri değerlerini kaydedersem, uygulama kaldırıldıktan sonra bu koleksiyona erişiminiz mümkün olmaz.python mainloop'un bitiminden sonra check-out değerini al

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

Orada genellikle bu yapmak gerekmez, ama gerçekten bir onay düğmesi güncellendiğinde adında bir işlevi var ve bir değişkene değerler tasarruf sağlar gerekirse. – RobertR

+0

Daha iyi bir çözüm bilen varsa, lütfen – gek0n

cevap

1

Tamam, kodunuzu biraz modifiye. Açıklamalar içinde açıklama olarak açıklamalar bulacaksınız. Protokol yöntemini ekledim (self.master.protocol ile arayabilir) ve yakın yöntemi değiştirdi, böylece uygulamayı yok etmeden önce onay düğmelerini kullanarak yineleyin ve bir dizindeki bayrakları toplar, sonra da genel listeye dönüştürülür.

Bunu test etmek için kodunuzun görüntü bölümünü yorumlamalı ve sahte oyunların bir listesini yapmak için kendi oyun sınıfımı oluşturmam gerekiyordu.
Çözümümün zarif olup olmadığını bilmiyorum, ancak test koşullarında işe yaradı.

app.mainloop()'dan sonra print(out)'u deneyin, bu size sıfırlar ve bunların bir listesini verecektir.

Yardım edin. Ah, ve lütfen dökümü kontrol edin! Bu editör, kodumu yapıştırdığımda tuhaf bir şey yaptı.


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

'u kullanıyorum' Application() '' '' '' '' '' '' '' '' python '' ('' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' dır. Ve formumu ileti kutusu olarak kullanıyorum, ancak farklı içeriğe sahip. Bu yüzden her yıktığı zaman geri dönüş değerine ihtiyacım var. – gek0n

+0

Kodunuzun daha fazlasını yayınlayabilir misiniz? Hangi modülleri aldınız? "Application()" ın kendi yazdığın bir sınıf olduğunu mu düşündüm ?! – JosefScript

+0

i 'Uygulama' – gek0n