我有一个现有的Python 3程序,我在没有任何面向对象技术(这是我的第一个Python程序)的情况下编写得很快。是时候清理它了,而且我在课堂上工作时遇到了问题。
这是一个简化的例子。它只是尝试将ttk.Entry小部件放入类中,该小部件继承自ttk.Frame:
import tkinter as tk
from tkinter import ttk
class MyClass(ttk.Frame):
def __init__(self, parent):
self.frame = ttk.Frame(parent)
# Entry widget
self.entValue = ttk.Entry(self.frame)
self.entValue.grid(column=0, row=0)
# tkinter init
root = tk.Tk()
# Make the class instance and place it
test = MyClass(root)
test.grid(column=0, row=0)
它给了我以下错误:
Traceback (most recent call last):
File "{path_to_code}/so.py", line 17, in <module>
test.grid(column=0, row=0)
File "{path_to_python}\Python35-32\lib\tkinter\__init__.py", line 2072, in grid_configure
self.tk.call(
AttributeError: 'MyClass' object has no attribute 'tk'
我错过了什么?
答案 0 :(得分:2)
您的相框尚未初始化。将super().__init__(parent)
添加到MyClass.__init__
方法的顶部以允许ttk初始化框架。
另外,我认为你可以摆脱self.frame
。将self
设置为MyClass
中小部件的父级,而不是self.frame
。
答案 1 :(得分:-1)
请不要在Tkinter中使用GRID方法。这是Tkinter中最糟糕的方法。 请使用Place()方法设计GUI。它很容易实现。
有关Place()的详细检查详情,请参阅此帖how to i position buttons in tkinter?
place方法不像grid()那样复杂。检查帖子,以便在Python中更好地使用GUI。