2017-06-14 50 views
0

我试图用tkinter和ttk创建一个窗口。当我在Windows 7 Pro PC上运行脚本时,出现错误提示没有名为ttk的模块,但是当我查看我的电脑时,我看到该模块。这个确切的脚本也适用于我的RPi,但没有问题。我究竟做错了什么?我需要重新安装ttk吗?如果是的话,如何?是没有名为'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 
+0

我已经更新了我的答案,以解释在程序中导致问题的原因,我也对发布的代码进行了一些更改并解释了一些内容。 –

+0

你运行python 2或3吗?这两种版本导入ttk的方式不同。 –

回答

0

更新:

所以我看到你的程序有几个问题。

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

这里的问题不是ttk进口,但mainloop您必须()调用主循环这么做mainloop()代替。

如果你只改变root.mainlooproot.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. 

更新:

按照您在评论中质疑:通过给

orange 

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() 

控制台结果名字我们正在创建一个对象,我们可以与其他类的属性进行交互。

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

+0

非常感谢。这清除了它。我有一个后续问题。你谈论命名主窗口从外面与对象进行交互,你是什么意思。你可以说,我是一个总noob。 – CowardlyDoomsday

+0

@CowardlyDoomsday:我会将示例添加到我的答案中,以便您可以看到结果,但最终我们会这样做,以便我们可以与类外部的对象属性进行交互。这可以让我们做很多有趣的事情。有关详细信息,请参阅我的答案更新。 –

0

对于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)。

+0

我应该澄清我正在使用2.7。我尝试切换到python3并使用它,但我的窗口没有生成。错误确实消失了。 – CowardlyDoomsday

+0

我已经更新了我的答案。听起来像你有安装问题。从头重新安装python。 – scotty3785