为什么我不能使用tkinter网格方法放置此类?

时间:2017-07-07 20:50:44

标签: python python-3.x class oop tkinter

我有一个现有的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'

我错过了什么?

2 个答案:

答案 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。