I’m fairly new to python and can’t get a test program functioning. The goal was to create an address book using objects to hold information. The widget runs but when a button is clicked instead of updating I get the error
"Exception in Tkinter callback
Traceback (most recent call last):
File "C:UsersneuvillerlDesktopPython27liblib-tkTkinter.py", line 1542, in __call__
return self.func(*args)
File "C:Usersneuvillerlworkspacevtk_testingwid.py", line 71, in <lambda>
btns = Tkinter.Button(nam, text = x.get_name(), command= lambda x=x: update(x),bg = 'blue', fg = 'white')
File "C:Usersneuvillerlworkspacevtk_testingwid.py", line 61, in update
lbl5.configure(nam, text = "name: " + str(person.get_name()))
File "C:UsersneuvillerlDesktopPython27liblib-tkTkinter.py", line 1331, in configure
return self._configure('configure', cnf, kw)
File "C:UsersneuvillerlDesktopPython27liblib-tkTkinter.py", line 1322, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
TclError: unknown option "-colormap""
And the code :
nam = Tkinter.Tk()
class person(object):
def __init__(self, name, phone, address, email):
self.name = name
self.phone = phone
self.address = address
self.email = email
def get_name(self):
return self.name
def get_phone(self):
return self.phone
def get_address(self):
return self.address
def get_email(self):
return self.email
riley = person("Riley", "XXX-XXX-XXXX", "This place", "email1@hi.com")
alex = person("Alex","XXX-XXX-XXXX", "That place", "email2@hi.com")
maggie = person("Maggie","XXX-XXX-XXXX","Other place","email3@hi.com")
lst = [riley,alex,maggie]
def update(person):
lbl5.configure(nam, text = "name: " + str(person.get_name()))
lbl6.configure(nam, text = "phone#: " + str(person.get_phone()))
lbl7.configure(nam, text = "address: " + str(person.get_address()))
lbl8.configure(nam, text = "email: " + str(person.get_email()))
lbl5 = Tkinter.Label(nam, text = "name:" )
lbl6 = Tkinter.Label(nam, text = "phone#:" )
lbl7 = Tkinter.Label(nam, text = "address:" )
lbl8 = Tkinter.Label(nam, text = "email:" )
for x in lst:
btns = Tkinter.Button(nam, text = x.get_name(), command= lambda x=x:
update(x),bg = 'blue', fg = 'white')
btns.pack(fill = Tkinter.X)
lbl5.pack()
lbl6.pack()
lbl7.pack()
lbl8.pack()
nam.mainloop()`
Exception in Tkinter callback
Traceback (most recent call last):
File «C:UsersDanilAppDataLocalProgramsPythonPython38libtkinter__init
__.py», line 1892, in __call__
return self.func(*args)
File «tt.py», line 12, in btn_click
messagebox.showinfo(title= ‘Название’, message=info_str)
NameError: name ‘messagebox’ is not defined
from tkinter import*
root = Tk()
def btn_click():
login = loginInput.get()
password = passField.get()
info_str = f'Данные : {str(login)}, {str (password)}'
messagebox.showinfo(title= 'Название', message=info_str)
# ошибка
# messagebox.showerror(title='', message='!!!Ошибка!!!' )
root['bg'] = '#fafafa'
root.title ('Название программы')
root.wm_attributes('-alpha', 1)
root.geometry('700x600')
root.iconbitmap('C:/Users/Danil/Desktop/armchair-icon.ico')
root.resizable(width=True , height=True)
canvas = Canvas(root, height=700, width=600)
canvas.pack()
frame = Frame(root, bg='green')
frame.place(relx=0.15, rely=0.15, relwidth=0.7 , relheight=0.7 )
titel = Label(frame, text='Logerpod', bg='gray', font=40)
titel.pack()
btn= Button(frame, text='Кнопка', bg= 'blue' , command =btn_click )
btn.pack()
loginInput = Entry(frame, bg= 'white')
loginInput.pack()
passField = Entry(frame, bg= 'white', show='*')
passField.pack()
root.mainloop()
Я только начал свой первый проект на Python (извините, если это глупый вопрос, который я только начинаю) и использую интерфейс Tkinter. Я, кажется, продолжаю получать это приглашение:
Исключение в обратном вызове Tkinter (последний вызов был последним): файл «D: Apps Python lib tkinter__init __. Py», строка 1883, в ____call____ возвращают self.func (* args) Файл «c: / Users / noahc / Документы / Программирование / AppLauncher / AppLauncher.py «, строка 62, в resetList = tk.Button (root, text =» Reset «, padx = 10, pady = 5, fg =» white «, bg =» # 263D42 «, command = lambda: [removeSave (), resetList ()]) TypeError: объект ‘Button’ не вызывается
Я предоставил код ниже:
#########################
# 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 + ',')
Спасибо,
nozzypozzy
2 ответа
Лучший ответ
Я полагаю, вы имеете в виду, что после нажатия кнопки сброса, затем «Открыть файл», и он заполняет ваш список с предыдущими записями? Когда вы выполняете resetList
, вы просто удаляете элементы с экрана, но сохраняете заполненный список apps
, поэтому при вызове addApp
этот список загружается и отображается снова с новым элементом в конце. Это можно исправить, вызвав apps.clear()
в функции resetList
, которая удалит все записи в apps
. — ответ @Talon
0
nozzypozzy
4 Май 2020 в 06:37
Ваша функция resetList
делит имя с вашей переменной Button. Вместо вашей функции он пытается вызвать себя.
На этой линии:
resetList = tk.Button(root, text="Reset", padx=10, pady=5, fg="white", bg="#263D42", command=lambda:[removeSave(),resetList()])
Вы используете лямбда-функцию для выполнения функций 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()
2
Talon
2 Май 2020 в 11:32
from tkinter import *
from functools import partial
from tkinter.messagebox import *
import re
#текст
a="Авторизируйтесь" #Зоглоловок окна
b="Вход в приложение"#Текст в приложениии
c="Пожайлуста введите данные:"#Текст в приложение 2
d="Вы зарагистрированны?"#Вопрос о регистрации пользовотеля
e="Придумайте надежный логин и пароль"
f="Регистрация"
#Логины
namelist = ["ilia"]
#Пароли
passwdlist= ["2" "1"]
window = Tk()
window.title(a)
text1=Label(text=b)
text1.pack(fill=BOTH, expand=True)
text2=Label(text=c)
text2.pack(fill=BOTH, side=LEFT, expand=True)
entryLOGIN = Entry()
entryLOGIN.insert(0,"Логин")
entryLOGIN.pack(fill=BOTH, side=LEFT, expand=True)
entryPASS = Entry()
entryPASS.pack(fill=BOTH, side=LEFT, expand=True)
entryPASS.insert(0,"Пароль")
i=0
#Оценка стойкости пароля
def ChekDATA(entryEPASS,entryELOGIN,namelist,passwdlist):
passw=entryEPASS.get()
name=entryELOGIN.get()
fl=0
a=0
while True:
if (len(passw)<8):
fl=-1
break
elif not re.search("[a-z]",passw):
fl=-1
break
elif not re.search ("[A-Z]",passw):
fl=-1
break
elif not re.search("[0-9]",passw):
fl=-1
break
elif re.search("s",passw):
fl=-1
break
if fl==0:
passwdlist.append(passw)
a=a+1
while True:
if (len(name)<8):
fl=-1
break
elif not re.search("[a-z]",name):
fl=-1
break
elif not re.search ("[A-Z]",name):
fl=-1
break
elif not re.search("[0-9]",name):
fl=-1
break
elif re.search("s",name):
fl=-1
break
if fl==0:
namelist.append(name)
a=a+1
if a==2:
avt(passwdlist,namelist,a,b,c,d,e,f,window)
else:
showinfo("Информация","Пароль ненадежн повторите попытку")
reg(window)
#Приложение регистрации
def reg(window):
window.destroy()
Regw= Tk()
Regw.title(f)
text1E=Label(text=e)
text1E.pack(fill=BOTH, expand=True)
text2E=Label(text=c)
text2E.pack(fill=BOTH, side=LEFT, expand=True)
entryELOGIN = Entry()
entryELOGIN.insert(0,"Логин")
entryELOGIN.pack(fill=BOTH, side=LEFT, expand=True)
entryEPASS = Entry()
entryEPASS.pack(fill=BOTH, side=LEFT, expand=True)
entryEPASS.insert(0,"Пароль")
buttonREG = Button(text="Ввести",command=partial
(
ChekDATA,
entryPASS,
entryLOGIN,
namelist,
passwdlist
))
buttonREG.pack(fill=BOTH, side=BOTTOM, expand=True)
def avt(passwdlist,namelist,a,b,c,d,e,f,window):
#Приложение авторизации
window.destroy()
window = Tk()
window.title(a)
text1=Label(text=b)
text1.pack(fill=BOTH, expand=True)
text2=Label(text=c)
text2.pack(fill=BOTH, side=LEFT, expand=True)
entryLOGIN = Entry()
entryLOGIN.insert(0,"Логин")
entryLOGIN.pack(fill=BOTH, side=LEFT, expand=True)
entryPASS = Entry()
entryPASS.pack(fill=BOTH, side=LEFT, expand=True)
entryPASS.insert(0,"Пароль")
i=0
#Функция авторизации и проверки паролей на подлинность
def increase(namelist,passwdlist,entryLOGIN,entryPASS,i):
p=entryPASS.get()
name=entryLOGIN.get()
while i<10:
if name in namelist:
print("имя есть")
if p in passwdlist:
print(a)
window.destroy()
main(name)
else:
entryPASS.delete(0,END)
i=+1
else :
showerror(
"Ошибка","Введен неверный логин"
)
enrtyLOGIN.delete(0,END)
i=+1
else:
showerror(
"Ошибка","Попытки кончились"
)
buttonVXOD = Button(
master=window,
text="Войти",
command=partial(increase,
namelist,
passwdlist,
entryLOGIN,
entryPASS,
i
)
)
buttonVXOD.pack(fill=BOTH, side=BOTTOM, expand=True)
#Вопрос о том зарегистрирован ли пользователь
def check():
answer = askyesno(
title="Вопрос",
message=d
)
if answer:
avt(passwdlist,namelist,a,b,c,d,e,f,window)
else:
reg(window)
check()
window.mainloop()
Jan-04-2017, 04:58 PM
(This post was last modified: Jan-04-2017, 05:07 PM by snippsat.)
New to Python. No matter what I enter, it doesn’t like the arguments in the function. Appreciate any help.
Error:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:Python27liblib-tkTkinter.py", line 1536, in __call__
return self.func(*args)
TypeError: go() takes exactly 1 argument (0 given)
The function is inside a class and the command for a button. It takes entries from two entry boxes and a spinbox. The time part works fine separately, and it does get the spinbox info ok.
def go(self): def time(): e1= entry1.get() e2= entry2.get() run_time_min= float(e1) run_time_sec= float(e2) time= run_time_min * 60 + run_time_sec return time def calc(): sb1 = spinbox1.get() if sb1 == '8mm': feet=time/fpsecs8 print feet elif sb1 == 'Super 8': feet= time/fpsecss8 print feet elif sb1 == '16mm': feet= time/fpsecs16 print feet elif sb1 == '16 Sound': feet= time/fpsecs16s print feet
Posts: 11,664
Threads: 451
Joined: Sep 2016
Reputation:
446
You aren’t showing enough code.
Where is your class definition, and the code that calls it ?
Your passing args, but the functions that you are showing don’t receive any
Posts: 16
Threads: 3
Joined: Jan 2017
Reputation:
0
Jan-04-2017, 06:15 PM
(This post was last modified: Jan-04-2017, 06:22 PM by snippsat.)
Sorry. Here’s more.
class FilmCalc(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title("Film Calculator") self.grid frame1 = Frame(root) frame1.grid frame_rate_8=float(17) frame_rate_s8 = float(17) frame_rate_16 = float(20) frame_rate_16s = float(24) fpft8 = float(80) fpfts8 = float(72) fpft16 = float(40) fpsecs8 = fpft8/frame_rate_8 fpsecss8 = fpfts8/frame_rate_s8 fpsecs16 = fpft16/frame_rate_16 fpsecs16s = fpft16/frame_rate_16s global spinbox1 global entry1 global entry2 entry1 = IntVar(None) entry2 = IntVar(None) global time def go(self): def time(): e1= entry1.get() e2= entry2.get() run_time_min= float(e1) run_time_sec= float(e2) time= run_time_min * 60 + run_time_sec return time def calc(): sb1 = spinbox1.get() if sb1 == '8mm': feet=time/fpsecs8 print feet elif sb1 == 'Super 8': feet= time/fpsecss8 print feet elif sb1 == '16mm': feet= time/fpsecs16 print feet elif sb1 == '16 Sound': feet= time/fpsecs16s print feet def reset(): entry1.delete(0, END) entry2.delete(0, END) spinbox1.selection_clear() spinbox1 = Spinbox(root, values= ("8mm", "Super 8", "16mm", "16 Sound"), wrap = TRUE) spinbox1.grid(row=0, column=1, padx=105, pady=15) lbl1 = Label(root, text="Minutes", width=8) lbl1.grid(row=2, column=2, pady=15, sticky=W) entry1 = Entry(root, justify= RIGHT) entry1.grid(row=2, column=1, pady=15) lbl2 = Label(root, text="Seconds", width=8) lbl2.grid(row=3, column=2, sticky=W) entry2 = Entry(root, justify= RIGHT) entry2.grid(row=3, column=1) resetButton = Button(root, text="Reset", command= reset) resetButton.grid(row=4, column=1, pady=100) calcButton = Button(root, text="Calculate", command= go) calcButton.grid(row=4, column=2)
Edit admin:
Use code tag,look BBcode help.
Posts: 11,664
Threads: 451
Joined: Sep 2016
Reputation:
446
Jan-04-2017, 09:16 PM
(This post was last modified: Jan-04-2017, 09:16 PM by Larz60+.)
Did you import tkinter like
from tkinter import *
Posts: 16
Threads: 3
Joined: Jan 2017
Reputation:
0
Jan-04-2017, 09:31 PM
(This post was last modified: Jan-04-2017, 11:20 PM by Larz60+.)
Yes. It makes the window and fields correctly, but fails when pressing the calculate button.
from Tkinter import * root = Tk() root.geometry("450x350+200+100") class FilmCalc(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title("Film Calculator") self.grid frame1 = Frame(root) frame1.grid frame_rate_8=float(17) frame_rate_s8 = float(17) frame_rate_16 = float(20) frame_rate_16s = float(24) fpft8 = float(80) fpfts8 = float(72) fpft16 = float(40) fpsecs8 = fpft8/frame_rate_8 fpsecss8 = fpfts8/frame_rate_s8 fpsecs16 = fpft16/frame_rate_16 fpsecs16s = fpft16/frame_rate_16s global spinbox1 global entry1 global entry2 entry1 = IntVar(None) entry2 = IntVar(None) global time def go(self): def time(): e1= entry1.get() e2= entry2.get() run_time_min= float(e1) run_time_sec= float(e2) time= run_time_min * 60 + run_time_sec return time def calc(): sb1 = spinbox1.get() if sb1 == '8mm': feet=time/fpsecs8 print feet elif sb1 == 'Super 8': feet= time/fpsecss8 print feet elif sb1 == '16mm': feet= time/fpsecs16 print feet elif sb1 == '16 Sound': feet= time/fpsecs16s print feet def reset(): entry1.delete(0, END) entry2.delete(0, END) spinbox1.selection_clear() spinbox1 = Spinbox(root, values= ("8mm", "Super 8", "16mm", "16 Sound"), wrap = TRUE) spinbox1.grid(row=0, column=1, padx=105, pady=15) lbl1 = Label(root, text="Minutes", width=8) lbl1.grid(row=2, column=2, pady=15, sticky=W) entry1 = Entry(root, justify= RIGHT) entry1.grid(row=2, column=1, pady=15) lbl2 = Label(root, text="Seconds", width=8) lbl2.grid(row=3, column=2, sticky=W) entry2 = Entry(root, justify= RIGHT) entry2.grid(row=3, column=1) resetButton = Button(root, text="Reset", command= reset) resetButton.grid(row=4, column=1, pady=100) calcButton = Button(root, text="Calculate", command= go) calcButton.grid(row=4, column=2) #lbl3 = Label(root, text= entry1.cget()) #lbl3.grid(row=5, column=1, pady= 100) app = FilmCalc(root) root.mainloop()
Posts: 11,664
Threads: 451
Joined: Sep 2016
Reputation:
446
Posts: 16
Threads: 3
Joined: Jan 2017
Reputation:
0
It’s the command for the calcButton.
Posts: 11,664
Threads: 451
Joined: Sep 2016
Reputation:
446
Jan-05-2017, 06:10 PM
(This post was last modified: Jan-05-2017, 06:10 PM by Larz60+.)
Didn’t find it first time
you need
def go(self, event):
Posts: 16
Threads: 3
Joined: Jan 2017
Reputation:
0
Error:
Exception in Tkinter callback
Traceback (most recent call last):
File «C:Python27liblib-tkTkinter.py», line 1536, in __call__
return self.func(*args)
TypeError: go() takes exactly 2 arguments (0 given)
I had tried that before, and it still gives the above error.
Posts: 11,664
Threads: 451
Joined: Sep 2016
Reputation:
446
Jan-05-2017, 06:22 PM
(This post was last modified: Jan-05-2017, 06:23 PM by Larz60+.)