Python 3.3 and TKinter, error message and crash -
as hobby dabble in python stuff. trying make simple program beloved wife track , identify food sensitivities. have working version of in place, out of boredom tried improve adding little ticker widget home screen. upon doing so, developed error cannot figure out. i'm not sure trying tell me honestly. occurs whenever click "next" button main menu.
my code:
from tkinter import * import os, shelve class food: def __init__(self, name, score): self.name = name self.score = score class main: def __init__(self, master): self.master = master self.master_frame = frame(self.master) self.master_frame.pack() self.home_frame() def home_frame(self): child in self.master_frame.winfo_children(): child.destroy() self.ticker = ' ' * 29 self.start = 0 self.end = 29 in catalog.values(): self.ticker = self.ticker + str(i.name) + ': ' + str(i.score) + '%' + ' ' * 10 print(self.ticker) self.create_widgets() def create_widgets(self): self.ticker_frame = frame(self.master_frame, bd = 5, bg = 'black') self.ticker_label = label(self.ticker_frame, text = '<empty>', fg = 'white', bg = 'black') self.ticker_label.grid(row = 0, columnspan = 3, sticky = e + w) self.ticker_frame.pack(expand = 1, fill = 'x', anchor = 'center') self.button_frame = frame(self.master_frame, bd = 5, bg = 'black') button(self.button_frame, text = 'next', width = 10, command = self.next_win).grid(row = 0, column = 0) button(self.button_frame, text = 'n/a', width = 10, command = self.master.destroy).grid(row = 0, column = 1) button(self.button_frame, text = 'exit', width = 10, command = self.master.destroy).grid(row = 0, column = 2) self.button_frame.pack() self.run_ticker() def run_ticker(self): ticker_text = self.ticker[self.start:self.end] self.ticker_label.config(text = ticker_text, font = ('courier', 10, 'bold')) self.start += 1 self.end += 1 if self.start == len(self.ticker): self.start = 0 self.end = 29 self.master.after(250, self.run_ticker) def next_win(self): child in self.master_frame.winfo_children(): child.destroy() self.next_frame = frame(self.master_frame) new_label = label(self.next_frame, text = 'blah...').grid() button(self.next_frame, text = 'main', command = self.home_frame).grid() self.next_frame.pack() x = food('grapes', 50) y = food('cheese', 75) z = food('eggs', 35) catalog = {} catalog[x.name] = x catalog[y.name] = y catalog[z.name] = z root = tk() main(root) root.mainloop() the error message getting, same either button:
exception in tkinter callback traceback (most recent call last): file "c:\python33\lib\tkinter\__init__.py", line 1442, in __call__ return self.func(*args) file "c:\python33\lib\tkinter\__init__.py", line 501, in callit func(*args) file "c:\users\gregory\desktop\test2 working except ticker.pyw", line 111, in run_ticker self.ticker_label.config(text = ticker_text, font = ('courier', 10, 'bold')) file "c:\python33\lib\tkinter\__init__.py", line 1230, in configure return self._configure('configure', cnf, kw) file "c:\python33\lib\tkinter\__init__.py", line 1221, in _configure self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) _tkinter.tclerror: invalid command name ".52922632.52924032" mr. oakley put eloquently when responded previous question of mine, "unless know going on under hood..." , not, why have no clue shell trying tell me.
also, less important question: i'm trying keep program's main menu in upper right corner of screen. attempts have failed. initializes away upper right corner, upon opening new window moves properly, , upon returning main menu, falls proper position. missing here too.
thanks always!
you have destroy
def next_win(self): child in self.master_frame.winfo_children(): child.destroy() which contains ticker_frame , of it's widgets, after statement in run_ticker() still calling function after frame has been destroyed. use variable self.is_tinker_frame = true when frame created, , set false when frame destroyed plus:
if self.is_tkinter_frame: self.master.after(250, self.run_ticker) additionally, wait longer 250 after variable set false, destroy frame, allow calls finish.
Comments
Post a Comment