没有名为 'ttk' 的模块,但它在文件夹中

no module named 'ttk', but its in the folder

我正在尝试使用 tkinter 和 ttk 创建 window。当我 运行 我的 Windows 7 Pro PC 上的脚本时,我收到错误消息,指出没有名为 ttk 的模块,但是当我查看我的 PC 时,我看到了该模块。这个确切的脚本也适用于我的 RPi,没有问题。我究竟做错了什么?我是否需要重新安装 ttk,如果需要,如何安装?

try:
    import tkinter as tk
    from tkinter import * 
except:
    import Tkinter as tk
    from Tkinter import *
import ttk

class MainWindow(tk.Frame):
    def __init__(self, master):
        self.master = master
        tk.Frame.__init__(self,master)

        tk.Label(self, text = 'Hi').grid(row = 1, column = 1)
        tk.Button(self, text = 'Button 1', width = 10, fg = 'red', command = self.button).grid(row = 2, column = 1)

        self.grid()

    def button(self):
        print('Yo')
if __name__ == '__main__':
    root = tk.Tk()
    MainWindow(root)
    root.mainloop

对于Python3,导入ttk的方法如下

from tkinter import ttk

from tkinter import *
from tkinter.ttk import *

覆盖 tkinter 基础小部件。

对于Python 2

import ttk

from Tkinter import *
from ttk import *

是记录在案的方法。

如果这些都不起作用,则表明安装有问题。

(如果您使用的是Python 2.7,请开始使用Python 3,Python 2 is almost end of life)。

更新:

所以我发现你的程序有几个问题。

请记住,在 windows 版本中,tkinter 和 ttk 默认带有 python。您不必重新安装 tkinter。如果您的 python 有问题,那么您应该重新安装 python。

这里的问题不是 ttk 导入,而是 mainloop 您必须使用 () 调用 mainloop,所以请 mainloop() 代替。

如果您只将 root.mainloop 更改为 root.mainloop(),您的程序将在 python 2.

中运行

但是您的程序有几处错误。

看看下面的内容:

try:
    # Python 3.x
    import tkinter as tk
    from tkinter import ttk #this is how we import for Python 3.x
except:
    # Python 2.x
    import Tkinter as tk
    import ttk # this needs to be inside the except: not outside like you had it.
    # this is because if you were to move to python 3 with this it would not work and cause an error.

class MainWindow(tk.Frame):
    # I added in the *args and ** kwargs to show what a full class __init__ can accept.
    def __init__(self, master, *args, **kwargs): 
        tk.Frame.__init__(self, master, *args, **kwargs)

        self.master = master
        # for your label and button you need to set it as a variable.
        self.my_label = tk.Label(self.master, text = 'Hi').grid(row = 1, column = 1)
        self.my_button = tk.Button(self.master, text = 'Button 1', width = 10, fg = 'red', command = self.button).grid(row = 2, column = 1)

    def button(self):
        print'Yo'
        # print('Yo') # python 3

if __name__ == "__main__":
    root = tk.Tk() 
    app = MainWindow(root) # you should define your main window as something. This way you can interact with the object from outside.
    tk.mainloop() # this must be called in order to tkinter to work.

更新:

根据您在评论中的提问:

import tkinter as tk


class MintApp(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.root = parent
        self.py_frame_color = "orange" # this is an attribute
        self.root.config(bg = self.py_frame_color)


if __name__ == "__main__":
    root = tk.Tk() 

    MyApp = MintApp(root)

    print(MyApp.root.cget('bg'))

    tk.mainloop()

控制台结果:

orange

通过为 class 命名,我们创建了一个对象,我们能够从 class.

外部与其属性进行交互

我们还可以从 class 外部更改对象的属性。如果将此行 MyApp.root.config(bg = "blue") 添加到示例中,您将看到 window 变为蓝色。