Сообщение об ошибке при импорте функции - модули - PullRequest
0 голосов
/ 21 сентября 2018

Я строю калькулятор, и я нахожусь в части нажатия кнопки и отображения значения на экране.Для этого я создал два разных файла .py (я хочу использовать модули).В ответ на ваш запрос я дополню пост самым простым из возможных кодов, чтобы воспроизвести проблему.Это макет калькулятора:

from tkinter import *
from screenvalue import value 

root=Tk()
frame=Frame(root) #frame for the buttons and other options
frame.config(background="#40798C")
frame.pack()
#------------------------ SCREEN ----------------------

screen=Text(frame, width=150, height=5)
screen.grid(row=1, column=1, padx=5, pady=5, columnspan=15)
screen.config(background="#E2E2E2", fg="black")
#--------button---------------------------------

button4=Button(frame, text="4", width=10, padx=0, pady=0, command=value)
button4.grid(row=4,column=11)
root.mainloop()

, и этот модуль я использую

from tkinter import *
character=StringVar()

def value():
    return character.set("4")

Я изменил название модуля с typing.py screenvalue.py .Вы знаете, что происходит?Они оба находятся в одной папке

Большое спасибо заранее и мои извинения, если мой английский не ясен.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Tkinter - это многослойная вещь.Хотя вы используете его из Python, он фактически использует другой язык, Tcl, для управления графическим интерфейсом.

Вы получаете это сообщение об ошибке

AttributeError: 'NoneType' object has no attribute '_root'

, потому что вывы пытаетесь создать объект Tkinter перед запуском интерпретатора Tcl, что происходит, когда вы делаете root=Tk().

Так что вам нужно реорганизовать свой код так, чтобы

character = StringVar()

не выполнялся до того, как вы выполните root=Tk().

То, что character = StringVar() исполняется при импорте screenvalue.Вы могли бы просто переместить оператор импорта после root=Tk(), но было бы намного лучше изменить screenvalue, чтобы он не запускал код при импорте.


FWIW, character.set("4") возвращает None, так что нет особого смысла в том, чтобы функция возвращала это.Кроме того, нет смысла в функции обратного вызова, возвращающей полезное значение, поскольку вы не можете получить доступ к значению, возвращенному обратным вызовом.

0 голосов
/ 21 сентября 2018

Вы определили character = StringVar() вне области действия функции type, которую вы создали и импортировали во второй файл.В команде from typing import type вы импортируете только функцию type с ее областью действия, а character не определена в ней, что приводит к полученной вами ошибке.

Если вы переместите character = StringVar() в область действия функцииэто решит вашу проблему.

def type(): character = StringVar() return character.set("4")

PS Настоятельно рекомендуется не использовать имена переменных и функций, которые скрывают встроенные имена python, например 'type'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...