如何让 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 函数执行函数 removeSaveresetList。问题是您分配给此按钮的变量也称为 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

回答