Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

NameError: name 'mainloop' is not defined

#python #python_3x #tkinter


объясните пожалуйста почему так работает:
import tkinter

def recAction(*args):
    print('ddd')

root = tkinter.Tk()

row6 = tkinter.Frame(root, borderwidth = 10)
row6.pack(side = 'top', fill = 'x')
button = tkinter.Button(row6, text = 'Send', height = 20, width = 20, relief = 'raised',
cursor = 'hand1', font = ('times', 14, 'bold'))
button.bind('', recAction)
button.pack()

mainloop()

а так не работает:
import tkinter

def recAction():
    print('ddd')

root = tkinter.Tk()

row6 = tkinter.Frame(root, borderwidth = 10)
row6.pack(side = 'top', fill = 'x')
button = tkinter.Button(row6, text = 'Send', height = 20, width = 20, relief = 'raised',
cursor = 'hand1', font = ('times', 14, 'bold'))
button.bind('', recAction)
button.pack()

mainloop()

сообщение об ошибке такое:

Traceback (most recent call last):
File
"C:\Python33\projects\DVD_LIST\p3_dvd_list_shelve_3d_class_edit_menubar\q.py",
line 14, in 
    mainloop() NameError: name 'mainloop' is not defined

мне это не  понятно так как в интернетах много примеров именно второго типа. например
таких    


Ответы

Ответ 1



На вызов mainloop ругается потому, что эта функция определена внутри модуля tkinter. Нужно либо вызывать её как tkinter.mainloop(), либо включить её в пространство имен текущего модуля с помощью from tkinter import mainloop и вызывать просто как mainloop(). "Привязываемые" к событиям функции должны иметь как минимум один параметр, в который попадёт объект-событие. Опять же два варианта: смириться, и дать tkinter этот параметр, или объявить функцию recAction без параметров, а привязывать её через прослойку lambda, как предложил alexlz: button.bind('', lambda event: recAction())

Ответ 2



ну спасибо, помогли. хотя и я не понял почему именно нужно передавать аргумент, но теперь по крайней мере проблему буду решать следующим образом: button.bind('', lambda event: recAction(event)) ....... def recAction(event): print('ddd') и mainloop теперь буду записывать так: tkinter.mainloop :)

Комментариев нет:

Отправить комментарий