#python #tkinter #python-3.6
#python #tkinter #python-3.6
Вопрос:
В настоящее время я пытаюсь ввести несколько базовых полей пользовательского ввода, используя модуль tkinter в Python 3.6 (через Spyder). Я могу подтвердить, что модуль загружается и появляется опция выбора simpledialog, но я продолжаю получать следующую ошибку:
Ошибка атрибута: модуль ‘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: ")
Мои ожидаемые результаты заключаются в том, что появится всплывающее окно и я смогу получить информацию о пользователе, необходимую для поддержания стабильного соединения с сервером, который я использую.
Заранее благодарю вас за ваш совет!
Комментарии:
1. Возможно, у вас
tkinter.py
где-то есть файл, который скрывает фактический модуль.import tkinter; print(tkinter.__file__)
покажет вам, где это.2. Я проверил это, и я получаю местоположение здесь: C:ProgramDataAnaconda3libtkinter_init_.py В ходе исследования я заметил, что часть «Lib» на самом деле написана заглавными буквами в самом каталоге, в то время как в Spyder она написана строчными буквами. Я знаю, что Python чувствителен к регистру, так что вы думаете, что это может быть проблемой?
Ответ №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
Смотрите Модули tkinter
Комментарии:
1. Похоже, это все исправило! Большое вам спасибо. В качестве продолжения я также получаю пустое всплывающее окно, когда получаю свои пользовательские данные. Он просто говорит 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()
2. это нормально — это
Tk()
окно (главное окно). Я создаю его вручную, ноtkinter
могу создать его автоматически.simpledialog
был создан скорее для запускаTk()
, а не как отдельная программа. Вы можете свернуть главное окно с помощьюroot.iconify()
, но вы должны создатьroot
вручнуюroot = tk.Tk()
3. Это имеет смысл. Есть ли какой-нибудь способ, которым я могу автоматически закрыть его после получения моих входных данных? Я пробовал root.destroy и root.quit, но, похоже, они у меня не работают.
4. Если я использую
root.iconify()
илиroot.withdraw()
— который минимизирует окно, а также удаляет из нижней панели — тогда мне не нужноroot.destroy()
или даже мне не нужноroot.mainloop()
. И он корректно работает в терминале на Linux Mint / Python 3.7. Если я запускаю тот же код в какой-либо IDE, тогда это необходимоroot.destroy()
. Так что это может зависеть от того, где он запущен.
Ответ №2:
import tkinter as tk
from tkinter import simpledialog
root = tk.Tk()
ID = simpledialog.askstring("Please input your username.", "Username: ", parent=root)
root.mainloop()
Это сохранит всплывающее окно в родительском окне и будет видимым.
Комментарии:
1. Возможно, было бы лучше отформатировать этот ответ в виде кода