Ошибка с атрибутом TKinter Simpledialog

В настоящее время я пытаюсь написать несколько основных полей ввода пользователя, используя модуль tkinter в Python 3.6 (через Spyder). Я могу подтвердить, что модуль загружается и появляется возможность выбора простого диалога, но я продолжаю получать следующую ошибку:

AttributeError: модуль «tkinter» не имеет атрибута «simpledialog»

Изображение tkinter simpledialog

Я пытался найти другие варианты, но другие параметры пользовательского ввода, похоже, не работают в моем интерфейсе Python. Либо происходит сбой, либо данные структурированы неправильно.

Интересно, что в прошлом я делал подобные вещи в Python без ошибок, но это продолжает приводить к этой конкретной программной части.

import tkinter as tk
import pyodbc as py
py.pooling = False

## INPUT YOUR USER ID AND PASSWORD AND DECLARE YOUR CONNECTION
## THE DIALOG BOXES MAY POP OPEN ON ANOTHER SCREEN
## THE PASSWORD INPUT IS MASKED AND WILL NOT SHOW IN THE
## VARIABLE EXPLORER

ID = tk.simpledialog.askstring("Please input your username.","Username: ")
PW = tk.simpledialog.askstring("Please input your password.",
                               "Password: ", show='*')
CONN = tk.simpledialog.askstring("Please input your connection.",
                                 "Connection: ")

Мои ожидаемые результаты заключаются в том, что появится всплывающее окно, и я смогу получить информацию о пользователе, необходимую мне для поддержания стабильного соединения с сервером, который я использую.

Заранее спасибо за совет!

Возможно, у вас где-то есть файл tkinter.py, который затеняет реальный модуль. import tkinter; print(tkinter.__file__) покажет вам, где это находится.

jasonharper 08.04.2019 17:11

Я проверил это и получил местоположение здесь: C:\ProgramData\Anaconda3\lib\tkinter_в этом_.py В ходе исследования я заметил, что часть «Lib» на самом деле написана с заглавной буквы в самом каталоге, тогда как у Spyder она есть. в нижнем регистре. Я знаю, что Python чувствителен к регистру, так что вы думаете, что это может быть проблемой?

A_Pirates_Favorite_Letter 08.04.2019 17:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 967
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

simpledialog находится не в tkinter, а в tkinter.simpledialog, и вы должны импортировать его

import tkinter as tk
import tkinter.simpledialog

root = tk.Tk() # create main window
#root.iconify() # minimize main window 
root.withdraw() # hide main window 

answer = tkinter.simpledialog.askstring("Question", 'Your name:')
print(answer)

#root.destroy()  # should work without it
#root.mainloop() # should work without it

См. ткинтер модули

Кажется, это исправило ситуацию! Спасибо большое. В качестве продолжения я также получаю пустое всплывающее окно, когда получаю пользовательский ввод. Он просто говорит tk и не имеет других входов/выходов. Это нормально? Код, который я выполнил, таков: python ... ID = tksd.askstring("Please input your username.","Username: ") PW = tksd.askstring("Please input your password.", "Password: ", show='*') CONN = tksd.askstring("Please input your connection.", "Connection: ") root.mainloop()

A_Pirates_Favorite_Letter 08.04.2019 18:05

это нормально - это Tk() окно (главное окно). Я создаю его вручную, но tkinter могу создать его автоматически. simpledialog был создан скорее для запуска из Tk(), а не как отдельная программа. Вы можете свернуть главное окно с помощью root.iconify(), но вам нужно создать root вручную root = tk.Tk()

furas 08.04.2019 18:17

В этом есть смысл. Есть ли способ, которым я могу автоматически закрыть его после получения моих входных данных? Я пробовал root.destroy и root.quit, но, похоже, они у меня не работают.

A_Pirates_Favorite_Letter 08.04.2019 18:23

Если я использую root.iconify() или root.withdraw(), которые уменьшают окно, а также удаляют из нижней панели, то мне не нужно root.destroy() или даже не нужно root.mainloop(). И корректно работает в терминале на Linux Mint/Python 3.7. Если я запускаю тот же код в какой-то IDE, то ему нужен root.destroy(). Так что это может зависеть от того, где он работает.

furas 08.04.2019 18:48

Другие вопросы по теме