When my program is compiled via pyinstaller I run into this error:
Exception in Tkinter callback
Traceback (most recent call last):
File "tkinter\__init__.py", line 1892, in __call__
File "editSpeakers.py", line 67, in <lambda>
File "editSpeakers.py", line 52, in autoUpdateSpeakers
File "tkinter\__init__.py", line 3043, in get
_tkinter.TclError: invalid command name ".!editspeakers.!canvas.!frame.!entry"
I presume this is a tkinter problem but I have no idea how to fix it and it only shows up when ran via pyinstaller not when ran via the IDE
Code Snippets:
def populate(self):
speakers = main.openSpeakers()
speakersList = sorted(speakers.items())
numRows = len(speakers) + 3
for i in range(numRows):
self.key = tk.Entry(self.frame, width=20, fg="blue", font=("Arial", 16, "bold"))
self.value = tk.Entry(self.frame, width=20, fg="blue", font=("Arial", 16, "bold"))
self.key.grid(row=i, column=0)
self.value.grid(row=i, column=1)
EditSpeakers.entryList.append([self.key, self.value])
try:
self.key.insert(0, speakersList[i][0])
self.value.insert(0, speakersList[i][1])
except IndexError: pass
def autoUpdateSpeakers(self, root):
speakers = dict()
try:
for key, value in EditSpeakers.entryList:
if key.get():
speakers[key.get()] = value.get()
with open("speakers.json", "w") as f:
json.dump(speakers, f, indent=4)
except Exception as e: print(e) ## << Error happening here
finally: root.destroy()
You can find my full code here
Related
I have the following two files:
main.py
import tkinter as tk
import hashlib, json
from tkml import element
f = open("users.json", "r")
users = json.loads(f.read())
f.close()
f = open("users.json", "w")
window = tk.Tk()
window.title("Hello wold")
window.geometry("600x800")
pages = {}#initialize this variable
currentPage = ""#initialize this variable
def goTo(pageName):
global pages, currentPage
pages[currentPage].unloads()
pages[pageName].load(window)
currentPage = pageName
pages = {
"SignInOrCreateAccount": element(tk.Frame(),
[
element(tk.Button(text = "sign in", command = lambda : goTo("SignIn")), [], lambda widget, parent : widget.place(parent, anchor = "NW", relx = 0, rely = 0, x = 30, y = 30)),
element(tk.Button(text = "create account", command = lambda : goTo("CreateAccount")), [], lambda widget, parent : widget.place(parent, anchor = "NE", relx = 0, rely = 0, x = 30, y = 30))
], lambda widget, parent: widget.place(parent, relx = 0, rely = 0, relwidth = 1, relheight = 1))
}
currentPage = "SignInOrCreateAccount"
pages[currentPage].loads(window)
def saveUsersChanges():
global f, users
json.dump(users, f)
def attemptSignIn(username, password):
if username in users:
if hashlib.sha256(password.encode()).hexdigest() == users[username]["password"]:
pass # left off here
def onClose():
global f
saveUsersChanges()
f.close()
window.protocol("WM_DELETE_WINDOW", onClose())
tk.mainloop()
and tkml.py
class element:
def __init__(self, widget , children, load, unload = lambda widget: widget.place_forget()):
self.widget = widget # the tk widget
self.load = load # load just this widget using lambda function
self.unload = unload
self.children = children # child widgets
def loads(self, parent): # load this widget and all child widgets
self.load(self.widget, parent)
for child in self.children:
child.loads(self)
def unloads(self): # unloads widget and all child widgets
self.unload(self.widget)
for child in self.children:
child.unloads()
when I attempt to run it I get a very long error:
Traceback (most recent call last):
File "main.py", line 27, in <module>
pages[currentPage].loads(window)
_cnfmerge: fallback due to: 'element' object is not iterable
Traceback (most recent call last):
File "/usr/lib/python3.8/tkinter/__init__.py", line 111, in _cnfmerge
cnf.update(c)
TypeError: 'element' object is not iterable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "main.py", line 27, in <module>
pages[currentPage].loads(None)
File "/home/runner/Phoebe-Hacking-Puzzle/tkml.py", line 10, in loads
child.loads(self)
File "/home/runner/Phoebe-Hacking-Puzzle/tkml.py", line 8, in loads
self.load(self.widget, parent)
_cnfmerge: fallback due to: 'element' object is not iterable
Traceback (most recent call last):
File "/usr/lib/python3.8/tkinter/__init__.py", line 111, in _cnfmerge
cnf.update(c)
TypeError: 'element' object is not iterable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "main.py", line 27, in <module>
pages[currentPage].loads(window)
File "/home/runner/Phoebe-Hacking-Puzzle/tkml.py", line 10, in loads
child.loads(self)
File "/home/runner/Phoebe-Hacking-Puzzle/tkml.py", line 8, in loads
self.load(self.widget, parent)
Traceback (most recent call last):
File "main.py", line 27, in <module>
pages[currentPage].loads(window)
File "/home/runner/Phoebe-Hacking-Puzzle/tkml.py", line 8, in loads
self.load(self.widget, parent)
File "main.py", line 24, in <lambda>
], lambda widget, parent: widget.place(parent, relx = 0, rely = 0, relwidth = 1, relheight = 1))
File "/usr/lib/python3.8/tkinter/__init__.py", line 2439, in place_configure
self.tk.call(
_tkinter.TclError: unknown option "-bd"
I have tried debugging by wading into tkinter's source code and while I have successfully tracked down the line of code that the error comes from, I have no idea where this -bd has come from or what it means. I am new to tkinter, always having used pygame in the past, so there is a good chance I am simply using a function wrong, I would appreciate any help anyone can provide.
PS: I am running my code off repl.it if that makes any difference.
Alrighty so this is the error I get:
AttributeError: 'DES' object has no attribute 'summary_output'
So this is what I am trying to do.
When I am on this frame, I am creating a text variable that is then sent to a set class.
class upload_csv(Frame):
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master, width=250, height=160, bg='white')
self.upload_csv_btn = Button(
self.frame,
text="Add Data Source",
fg="DodgerBlue4",
font=("Graph Type", 15),
height=1, width=20,
borderwidth=2,
relief="groove",
command=self.upload)
self.upload_csv_btn.place(x=10, y=10)
self.frame.pack()
def upload(self):
global text
self.xvalues = []
self.yvalues = []
self.xyvalues = []
self.header = []
filename = filedialog.askopenfilename()
if len(filename) != 0:
print('Selected:', filename)
with open(filename) as file:
csvreader = csv.reader(file)
self.header.append(next(csvreader))
for row in csvreader:
if len(row) == 3:
self.xvalues.append(int(row[0]))
self.yvalues.append(int(row[1]))
self.xyvalues.append(int(row[2]))
text = (
self.header[0][0]+ ": " + str(self.xvalues).replace('[','').replace(']','') +
"\n\n" + self.header[0][1] + ": " + str(self.yvalues).replace('[','').replace(']','') +
"\n\n" + self.header[0][2] + ": " + str(self.xyvalues).replace('[','').replace(']',''))
elif len(row) == 2:
self.xvalues.append(row[0])
self.yvalues.append(row[1])
text = (
self.header[0][0] + ": " + str(self.xvalues).replace('[','').replace(']','') +
"\n\n" + self.header[0][1] + ": " + str(self.yvalues).replace('[','').replace(']',''))
# -------------------------------------------------------------------------
s = Set(text)
s.set_summary()
#-----------------------------------------------------------------------
Using the upload class, I am sending the variable by calling the set class, and calling the set_summary method. With this set class, I am setting the string as a an object item, that is then send to my DES class. I want this item to be set on a tk textbox element as a summary. I receive the text fine in the DES class, but I get the following error when trying to modify the summary element.
The error I get:
Traceback (most recent call last):
File "C:\Users\***\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "C:\Users\***\Documents\Workspace\***\***\view\upload_csv.py", line 115, in upload
s.set_summary()
File "C:\Users\***\Documents\Workspace\***\***\view\Set.py", line 14, in set_summary
s.set_summary_text()
File "C:\Users\***\Documents\Workspace\***\***\view\test.py", line 164, in set_summary_text
print(self.summary_output)
AttributeError: 'DES' object has no attribute 'summary_output'
My set class:
class Set:
def __init__ (self, summary):
self.summary = summary
def set_summary(self):
print(self.summary)
s = DES(self.summary)
s.set_summary_text()
My DES Class:
class DES(Frame):
def __init__(self, summary):
self.summary = summary
def createFrame(self, master):
self.frame = tk.Frame(master, width=750, height=968,bg='white')
self.summary_output = tk.Text(
self.frame,
height=8,
width=78,
bg="gray95",
borderwidth=2,
relief="groove",
font=("Arial", 12))
self.summary_output.configure(state='disabled')
self.summary_output.place(x=20, y=610)
self.frame.pack()
def set_summary_text(self):
print(self.summary)
print(self.summary_output)
self.summary_output.configure(state='normal')
self.summary_output.delete('1.0', END) # Remote all text
self.summary_output.insert('end',self.summary)
self.summary_output.configure(state='disabled') #Make text widget read only
def main():
global root
root = tk.Tk()
# app = DES(root)
# app = DES.createFrame(root)
s = DES("")
s.createFrame(root)
root.mainloop()
if __name__ == '__main__':
main()
Edit:
So after trying the answer I got the following error, all I did was add the suggestion:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\***\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "C:\Users\***\Documents\Workspace\\***\\***\view\upload_csv.py", line 115, in upload
s.set_summary()
File "C:\Users\\***\Documents\Workspace\\***\view\Set.py", line 22, in set_summary
s.createFrame(root)
File "C:\Users\\***\Documents\Workspace\\***\view\test.py", line 120, in createFrame
self.canvas.draw() # Create the graph canvas
File "C:\Users\\***\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 11, in draw
self._master.update_idletasks()
AttributeError: 'str' object has no attribute 'update_idletasks'
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\\***\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "C:\Users\\***\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\backends\_backend_tk.py", line 235, in filter_destroy
self._master.update_idletasks()
AttributeError: 'str' object has no attribute 'update_idletasks'
So I remove the matplot graph and got this error:
So maybe the graph is interfering? Im not sure, I need the graph.
The summary_output in DES class, will be defined in the
createFrame method.
You first instatiated from the DES class in the Set.set_summary()
method and then called the set_summary_text() method, which it uses
the summary_output. That's not correct, since the summary_output has not been defined, yet.
You should first, call the createFrame() method to define the
summary_output attribute and then call the set_summary_text() to
use summary_output.
Do something like this, in the Set class:
class Set:
def __init__ (self, summary):
self.summary = summary
def set_summary(self):
global root
print(self.summary)
s = DES(self.summary)
s.createFrame(root)
s.set_summary_text()
Or do whatever you think it's best for you, but you should define the summary_output first, and then print or use it.
I want to make a tkinter gui to convert pdf page into image. I tried this:
root = Tk()
def open_file():
global file
file = askopenfile(mode ='rb', filetypes =[('pdf files', '*.pdf')])
print('Selected:', file)
def pdftoimage():
pdf = wi(filename=file, resolution=300)
pdfimage = pdf.convert("jpeg")
i=1
for img in pdfimage.sequence:
page = wi(image=img)
page.save(filename="file.jpg")
i +=1
label1 = Label(root,text="Select the ")
button1 = Button(root, text="Select File",command=open_file)
button1.place(x=10,y=10)
button2 = Button(root,text="Convert pdf into image",command=pdftoimage)
button2.place(x=10,y=40)
button3 = Button(root,text="Exit",command=root.destroy)
button3.place(x=40,y=70)
root.mainloop()
but it gives the following error:
Traceback (most recent call last):
File "D:\Anaconda\lib\tkinter\__init__.py", line 1883, in __call__
return self.func(*args)
File "<ipython-input-4-be9660d3a6d2>", line 33, in pdftoimage
pdf = wi(filename=file, resolution=300)
File "D:\Anaconda\lib\site-packages\wand\image.py", line 9062, in __init__
self.read(filename=filename)
File "D:\Anaconda\lib\site-packages\wand\image.py", line 9654, in read
r = library.MagickReadImage(self.wand, filename)
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type
As far as i can understand, this is because of the type of file in askopenfile is _io.BufferedReader but wand takes class str type. If i am right about that then how to make wand to access the file from askopenfile function?
from tkinter import *
import pytube
import threading
def download():
link = test_url.get()
yt = pytube.YouTube(link)
videos = yt.get_videos()
n = quality.get()
vid = videos[n - 1]
destination = destination_test.get()
vid.download(destination)
def test():
threading.Thread(target=download()).start()
root = Tk()
test_url = StringVar()
quality = IntVar()
destination_test = StringVar()
url_label = Label(text='Enter Url')
quality_label = Label(text='quality')
url_label.grid(row=0, column=0)
quality_label.grid(row=1, column=0)
destination_label = Label(text='Destination')
destination_label.grid(row=2, column=0)
url_entry = Entry(textvariable=test_url)
url_entry.grid(row=0, column=1)
quality_entry = Entry(textvariable=quality)
quality_entry.grid(row=1, column=1)
destination_entry = Entry(textvariable=destination_test)
destination_entry.grid(row=2, column=1)
download_button = Button(text='download', command=test())
download_button.grid(row=3, column=1)
root.mainloop()
Traceback (most recent call last): File "C:\Program Files\JetBrains\PyCharm Community Edition
2017.1.4\helpers\pycharm_jb_unittest_runner.py", line 35, in
main(argv=args, module=None, testRunner=unittestpy.TeamcityTestRunner, buffer=not
JB_DISABLE_BUFFERING) File "C:\Python36\lib\unittest\main.py", line
93, in init
self.parseArgs(argv) File "C:\Python36\lib\unittest\main.py", line 140, in parseArgs
self.createTests() File "C:\Python36\lib\unittest\main.py", line 147, in createTests
self.module) File "C:\Python36\lib\unittest\loader.py", line 219, in loadTestsFromNames
suites = [self.loadTestsFromName(name, module) for name in names] File "C:\Python36\lib\unittest\loader.py", line 219, in
suites = [self.loadTestsFromName(name, module) for name in names] File "C:\Python36\lib\unittest\loader.py", line 153, in
loadTestsFromName
module = import(module_name) File "C:\Users\Matthew\PycharmProjects\test\test.py", line 37, in
download_button = Button(text='download', command=test()) File "C:\Users\Matthew\PycharmProjects\test\test.py", line 19, in test
threading.Thread(target=download()).start() File "C:\Users\Matthew\PycharmProjects\test\test.py", line 13, in download
vid = videos[n - 1] IndexError: list index out of range
Because the value of your variable 'n' either equals to 0, or it's larger than your number of videos by 2 or more.
Whatever quality.get() does, whatever quality variable is, n=quality.get() is the line that eventually causes error...
self.__tracksListBox = Listbox(self.__master, width=100, height=25).grid(row=0, column=1,
rowspan=4)
I'm trying to display options in a Listbox, but the following error is thrown:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
return self.func(*args)
File "C:\Users\aawiesinger5000\Desktop\CS 110 Final Project\layoutGUI.py", line 213, in showTracks
self.__tracksListBox.insert(END, titleStr)
AttributeError: 'NoneType' object has no attribute 'insert'
when I try to use the list box like this:
if tracks:
titleStr = ""
for track in tracks:
titleStr += track + "\n"
self.__tracksListBox.insert(END, titleStr)
Does anyone know why?
Thank you!!
grid method does not return; implicitly return None.
Separate the following statement into two statements:
self.__tracksListBox = Listbox(self.__master, width=100, height=25).grid(row=0, column=1,
rowspan=4)
like:
self.__tracksListBox = Listbox(self.__master, width=100, height=25)
self.__tracksListBox.grid(row=0, column=1, rowspan=4)