如何让 return self.func(*args) 在 Tkinter Python 中工作?
How do I get return self.func(*args) to work in Tkinter Python?
我刚刚开始我的第一个 Python 项目(如果这是一个愚蠢的问题我才刚刚开始,我很抱歉)并且正在使用 Tkinter 界面。我似乎不断收到此提示:
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Apps\Python\lib\tkinter_init_.py", line 1883, in call
return self.func(*args)
File "c:/Users/noahc/Documents/Programming/AppLauncher/AppLauncher.py", line 62, in
resetList = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),resetList()])
TypeError: 'Button' object is not callable
我提供了以下代码:
#########################
# CREATED BY NOZZYPOZZY #
#########################
import tkinter as tk
from tkinter import filedialog, Text
import os
root = tk.Tk()
root.title("App Launcher")
root.iconbitmap('C:/Users/noahc/Documents/Programming/AppLauncher/icon.ico')
root.resizable(0,0)
apps = []
if os.path.isfile('save.txt'):
with open('save.txt','r') as f:
tempApps = f.read()
tempApps = tempApps.split(',')
apps = tempApps
apps = [x for x in tempApps if x.strip()]
def addApp():
for widget in frame.winfo_children():
widget.destroy()
filename = filedialog.askopenfilename(initialdir="/", title="Select File", filetypes=(("Executables","*.exe"), ("All Files", "*.*")))\
apps.append(filename)
print(filename)
for app in apps:
label = tk.Label(frame, text=app, bg="gray")
label.pack()
def runApps():
for app in apps:
os.startfile(app)
def resetList():
for widget in frame.winfo_children():
widget.destroy()
def removeSave():
os.remove('save.txt')
canvas = tk.Canvas(root, height=700, width=700, bg="gray")
canvas.pack()
frame = tk.Frame(root, bg="white")
frame.place(relwidth=0.8, relheight=0.8, relx=0.1, rely=0.1)
openFile = tk.Button(root, text="Open File", padx=10, pady=5, fg="white", bg="#263D42", command=addApp)
openFile.pack()
runApps = tk.Button(root, text="Run Apps", padx=10, pady=5, fg="white", bg="#263D42", command=runApps)
runApps.pack()
resetList = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),resetList()])
resetList.pack()
for app in apps:
label = tk.Label(frame, text=app)
label.pack()
root.mainloop()
with open('save.txt', 'w') as f:
for app in apps:
f.write(app + ',')
您的函数 resetList
与您的 Button 变量共享一个名称。它尝试调用自身,而不是您的函数。
这一行:
resetList = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),resetList()])
您正在使用 lambda 函数执行函数 removeSave
和 resetList
。问题是您分配给此按钮的变量也称为 resetList
。我们可以检查当我们替换函数调用时打印出 resetList
是什么:
resetList = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),print(repr(resetList))])
执行后这会给我们
<tkinter.Button object .!button3>
您调用了您的函数 resetList
,但用也称为 resetList
的按钮覆盖了它,因此您的程序没有使用 resetList()
执行函数,而是尝试执行按钮。您可以通过重命名 Button 变量来解决此问题,例如:
reset_list_button = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),resetList()])
reset_list_button.pack()
我想你的意思是在你点击重置后,然后 "Open File" 它会用之前的条目填充你的列表?当您执行 resetList
时,您只是从显示中删除项目,但会填充 apps
列表,因此当您调用 addApp
时,将加载此列表并使用新元素再次显示在末尾。您可以通过在 resetList
函数中调用 apps.clear()
来解决此问题,这将删除 apps
中的所有条目。 – @Talon
回答
我刚刚开始我的第一个 Python 项目(如果这是一个愚蠢的问题我才刚刚开始,我很抱歉)并且正在使用 Tkinter 界面。我似乎不断收到此提示:
Exception in Tkinter callback Traceback (most recent call last): File "D:\Apps\Python\lib\tkinter_init_.py", line 1883, in call return self.func(*args) File "c:/Users/noahc/Documents/Programming/AppLauncher/AppLauncher.py", line 62, in resetList = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),resetList()]) TypeError: 'Button' object is not callable
我提供了以下代码:
#########################
# CREATED BY NOZZYPOZZY #
#########################
import tkinter as tk
from tkinter import filedialog, Text
import os
root = tk.Tk()
root.title("App Launcher")
root.iconbitmap('C:/Users/noahc/Documents/Programming/AppLauncher/icon.ico')
root.resizable(0,0)
apps = []
if os.path.isfile('save.txt'):
with open('save.txt','r') as f:
tempApps = f.read()
tempApps = tempApps.split(',')
apps = tempApps
apps = [x for x in tempApps if x.strip()]
def addApp():
for widget in frame.winfo_children():
widget.destroy()
filename = filedialog.askopenfilename(initialdir="/", title="Select File", filetypes=(("Executables","*.exe"), ("All Files", "*.*")))\
apps.append(filename)
print(filename)
for app in apps:
label = tk.Label(frame, text=app, bg="gray")
label.pack()
def runApps():
for app in apps:
os.startfile(app)
def resetList():
for widget in frame.winfo_children():
widget.destroy()
def removeSave():
os.remove('save.txt')
canvas = tk.Canvas(root, height=700, width=700, bg="gray")
canvas.pack()
frame = tk.Frame(root, bg="white")
frame.place(relwidth=0.8, relheight=0.8, relx=0.1, rely=0.1)
openFile = tk.Button(root, text="Open File", padx=10, pady=5, fg="white", bg="#263D42", command=addApp)
openFile.pack()
runApps = tk.Button(root, text="Run Apps", padx=10, pady=5, fg="white", bg="#263D42", command=runApps)
runApps.pack()
resetList = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),resetList()])
resetList.pack()
for app in apps:
label = tk.Label(frame, text=app)
label.pack()
root.mainloop()
with open('save.txt', 'w') as f:
for app in apps:
f.write(app + ',')
您的函数 resetList
与您的 Button 变量共享一个名称。它尝试调用自身,而不是您的函数。
这一行:
resetList = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),resetList()])
您正在使用 lambda 函数执行函数 removeSave
和 resetList
。问题是您分配给此按钮的变量也称为 resetList
。我们可以检查当我们替换函数调用时打印出 resetList
是什么:
resetList = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),print(repr(resetList))])
执行后这会给我们
<tkinter.Button object .!button3>
您调用了您的函数 resetList
,但用也称为 resetList
的按钮覆盖了它,因此您的程序没有使用 resetList()
执行函数,而是尝试执行按钮。您可以通过重命名 Button 变量来解决此问题,例如:
reset_list_button = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),resetList()])
reset_list_button.pack()
我想你的意思是在你点击重置后,然后 "Open File" 它会用之前的条目填充你的列表?当您执行 resetList
时,您只是从显示中删除项目,但会填充 apps
列表,因此当您调用 addApp
时,将加载此列表并使用新元素再次显示在末尾。您可以通过在 resetList
函数中调用 apps.clear()
来解决此问题,这将删除 apps
中的所有条目。 – @Talon