Преобразование Python 2.7 в Python 3 с помощью tkinter - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть работающее приложение, использующее Python 2.7 и Tkinter, которое использует следующие конструкции:

from Tkinter import *
import Tkinter
import tkFileDialog

class Window(Frame):                  
    #...
    #     other functional code
    #...

    def ChangeCWD(self):       #CWD is current working directory
        root = Tkinter.Tk()
        root.withdraw()
        directory = tkFileDialog.askdirectory( ... )

root = Tk()
root.mainloop()

У него есть метки, кнопки, холст, несколько фреймов и диалоговые окна с файлами, и все это прекрасно работает.Я начал обновлять код для работы на Python 3.5, и до сих пор все функции работают, за исключением диалога с файлами.Вот где я дошел до:

from tkinter import *
import tkinter
import tkinter.filedialog

class Window(Frame):                  
    #...
    #     other functional code
    #...

    def ChangeCWD(self):       #CWD is current working directory
        root = tkinter.Tk()
        root.withdraw()
        directory = filedialog.askdirectory( ... )

root = Tk()
root.mainloop()

Однако этот код выдает ошибку

"NameError: имя 'filedialog' не определено"

при достижении оператора filedialog.askdirectory ().Может ли кто-нибудь помочь мне понять, что я должен сделать, чтобы исправить ситуацию, пожалуйста?

В сторону, пожалуйста, будь осторожен со мной!Я всегда был весьма озадачен различными способами вызова операторов импорта и использованием «tk».или "корень".до вызова некоторых функций.В Интернете просто слишком много противоречивых объяснений, и я не могу получить ясную картину.

1 Ответ

1 голос
/ 29 сентября 2019

Вы используете import tkinter.filedialog, который импортирует tkinter.filedialog с пространством имен tkinter.filedialog, затем вы пытаетесь использовать filedialog в своем коде.

Выберите один из этих двух:

  • измените свой вызов на tkinter.filedialog.askdirectory( ... )
  • измените свой импорт на import filedialog from tkinter, который будет импортировать tkinter.filedialog с пространством имен filedialog.

Примечание: from tkinter import * может показаться, что он должен импортировать filedialog, но * не импортирует субмодули, если пакет явно не указал, что они должны.

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