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

#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. Возможно, было бы лучше отформатировать этот ответ в виде кода