В настоящее время я пытаюсь написать несколько основных полей ввода пользователя, используя модуль 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: ")
Мои ожидаемые результаты заключаются в том, что появится всплывающее окно, и я смогу получить информацию о пользователе, необходимую мне для поддержания стабильного соединения с сервером, который я использую.
Заранее спасибо за совет!
Я проверил это и получил местоположение здесь: C:\ProgramData\Anaconda3\lib\tkinter_в этом_.py В ходе исследования я заметил, что часть «Lib» на самом деле написана с заглавной буквы в самом каталоге, тогда как у Spyder она есть. в нижнем регистре. Я знаю, что Python чувствителен к регистру, так что вы думаете, что это может быть проблемой?
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()
это нормально - это Tk()
окно (главное окно). Я создаю его вручную, но tkinter
могу создать его автоматически. simpledialog
был создан скорее для запуска из Tk()
, а не как отдельная программа. Вы можете свернуть главное окно с помощью root.iconify()
, но вам нужно создать root
вручную root = tk.Tk()
В этом есть смысл. Есть ли способ, которым я могу автоматически закрыть его после получения моих входных данных? Я пробовал root.destroy и root.quit, но, похоже, они у меня не работают.
Если я использую root.iconify()
или root.withdraw()
, которые уменьшают окно, а также удаляют из нижней панели, то мне не нужно root.destroy()
или даже не нужно root.mainloop()
. И корректно работает в терминале на Linux Mint/Python 3.7. Если я запускаю тот же код в какой-то IDE, то ему нужен root.destroy()
. Так что это может зависеть от того, где он работает.
Возможно, у вас где-то есть файл
tkinter.py
, который затеняет реальный модуль.import tkinter; print(tkinter.__file__)
покажет вам, где это находится.