【问题标题】:Why can I not instatiate a new Frame object in Tkinter?为什么我不能在 Tkinter 中实例化一个新的 Frame 对象?
【发布时间】:2021-01-21 19:52:35
【问题描述】:

我正在尝试制作一个显示在 Tkinter 窗口中的交互式图表。但是,我无法创建一个 Frame 对象来放置在 Tkinter 窗口的网格中。

我以类风格创建了我的 Tkinter 对象,这里是它的实例化

window = Tk()
w = Graph(window, size, startX, startY, endX, endY)
window.geometry('1000x1000')
window.title('Tkinter Testing')
window.mainloop()

我指的是这个教程:Tkinter Geometry Manager

for x in range(len(self.graph)):
    for y in range(len(self.graph[0])):
        frame = window.Frame(
            master=window,
            relief=window.RAISED,
            borderwidth=1
        )
        frame.grid(row=x,column=y)
        label = window.Label(master = frame, text="testing")

这是控制台抛出的错误

DEPRECATION WARNING: The system version of Tk is deprecated and may be removed in a future release. Please don't rely on it. Set TK_SILENCE_DEPRECATION=1 to suppress this warning.
Traceback (most recent call last):
  File "Graph.py", line 158, in <module>
    w = Graph(window, size, startX, startY, endX, endY)
  File "Graph.py", line 23, in __init__
    self.displayGraph()
  File "Graph.py", line 39, in displayGraph
    frame = window.Frame(
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1909, in __getattr__
    return getattr(self.tk, attr)
AttributeError: Frame

【问题讨论】:

  • 您的意思是“Frame(...”还是“tk.Frame(...”)?
  • 另外,你在窗口而不是框架上调用.grid(),所以你的框架都不会真正出现。
  • 如果你输入了import tkinter as tk,你可以说tk.Tk()tk.Label()。如果您使用了from tkinter import *,则必须改为使用Tk()Label()(通常不建议使用此选项,因为这些名称的定义来自何处已不再明显)。
  • 我怀疑frame = window.tk.Frame() 会引发完全相同的错误。不管怎样,你试过frame = Frame(...吗?
  • Err...@jsonharper 已经解释了这一切。也许您需要使用 importtkinter 语句更新问题。

标签: python tkinter


【解决方案1】:

感谢 @quamarana 和 @jasonharper 阐明并解释问题。

这个问题的答案与 Tkinter 的导入方式有关。根据 import 语句,实例化对象时的语法略有不同。

import tkinter as tkfrom tkinter import Tk

button = tk.Button(...
frame = tk.Frame(...
label = tk.Label(...

from tkinter import *

button = Button(...
frame = Frame(...
label = Label(...

正如@jasonharper 指出的那样:

如果您使用 from tkinter import *,您将不得不说 Tk() 或 Label()(通常不建议使用此选项,因为这些名称的定义来自何处不再明显)。

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 2014-03-08
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多