如何在Tkinter中更改Frame的背景?

39

我一直在使用Python 3.3中的Tkinter创建一个电子邮件程序。 在各个网站上看到可以使用Frame.config(background="color")来设置Frame小部件的不同背景颜色。 然而,当我在我的框架中使用此命令时,会出现以下错误:

_tkinter.TclError: unknown option "-Background"

做以下内容时它不起作用:

frame = Frame(root, background="white")
或者:
frame = Frame(root)
frame.config(bg="white")

我无法理解它。 我可以发布全部源代码,但我不想将其暴露在互联网上,但是框架创建大致如下:

mail1 = Frame(self, relief=SUNKEN)
mail1.pack()
mail1.place(height=70, width=400, x=803, y=109)
mail1.config(Background="white")

我尝试了多种选项来修改背景。这个框架就像是一个包裹在收件箱邮件预览周围的外壳。

如果需要的话,这是我导入模块的方式:

import tkinter, time, base64, imaplib, smtplib
from imaplib import *
from tkinter import *
from tkinter.ttk import *
以下是完整的回溯信息:
Traceback (most recent call last):
File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 457, in <module>
main()
File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 453, in main
app = Application(root) #start the application with root as the parent
File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 60, in __init__
self.initINBOX()
File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 317, in initINBOX
mail1.config(bg="white")
File "C:\Python33\lib\tkinter\__init__.py", line 1263, in configure
return self._configure('configure', cnf, kw)
File "C:\Python33\lib\tkinter\__init__.py", line 1254, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: unknown option "-bg"

使用答案中的代码会产生以下错误:

  File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 317, in initINBOX
  mail1 = Frame(self, relief=SUNKEN, style='myframe')
  File "C:\Python33\lib\tkinter\ttk.py", line 733, in __init__
  Widget.__init__(self, master, "ttk::frame", kw)
  File "C:\Python33\lib\tkinter\ttk.py", line 553, in __init__
  tkinter.Widget.__init__(self, master, widgetname, kw=kw)
  File "C:\Python33\lib\tkinter\__init__.py", line 2075, in __init__
  (widgetName, self._w) + extra + self._options(cnf))
  _tkinter.TclError: Layout myframe not found

解决了!谢谢。就是右侧的收件箱栏,需要将背景设置为白色。 对结果感到满意,现在让我们来处理收件箱滚动。


4
混合使用“place”、“pack”和“grid”方法是个不好的主意。 - kalgasnik
好的,谢谢。我之前在一个Tkinter教程中看到有人使用了它,然后就一直沿用至今。不过我会优化我的代码,只使用place布局。 - IPDGino
@kalgasnik,是的,我发现在使用'code'pack'code'时,我无法创建所需的界面。 - IPDGino
@kalgasnik 我想使用“myframe”作为名称。现在可以工作了,谢谢!还有一个问题,放入框架中的标签具有灰色背景,因此仍然无法显示白色背景。是否有办法使标签背景透明? - IPDGino
2
@kalgasnik:我认为你给出了一些错误的建议。place 很少是正确的选择;通常情况下,packgridplace 更好。此外,在应用程序中混合使用它们是可以的,但不能在同一个容器小部件中混合使用它们。 - Bryan Oakley
显示剩余4条评论
2个回答

59

问题的根源在于您无意中使用了来自ttk包而不是tkinter包的Frame类。来自ttk的那一个不支持背景选项。

这就是为什么您不应该进行通配符导入的主要原因——可以覆盖类和命令的定义。

我建议像这样导入:

import tkinter as tk
import ttk

然后您将小部件前缀添加为tkttk

f1 = tk.Frame(..., bg=..., fg=...)
f2 = ttk.Frame(..., style=...)

只需要稍微多输入一点点,就能立即明显地知道你正在使用哪个小部件。如果你这样做了,你的代码中就不会出现这个错误。


谢谢!将来会用到它。通常我使用import tkinter as tk,但这次我保留了tkinter,因为我正在将我的程序从松散的函数转换为基于类的程序。 - IPDGino
1
@N.McA.:如果进行全局导入,这确实会成为错误的源头,这也是我提供此建议的原因。通过良好的编程习惯,这将不再是问题。 - Bryan Oakley
太棒了,非常好的发现。 - wesanyer

18

您使用的是ttk.Framebg选项不适用于它。 您应该创建样式并将其应用于框架。

from tkinter import *
from tkinter.ttk import * 

root = Tk()

s = Style()
s.configure('My.TFrame', background='red')

mail1 = Frame(root, style='My.TFrame')
mail1.place(height=70, width=400, x=83, y=109)
mail1.config()
root.mainloop()

是的,我的窗口宽度为1000。 - IPDGino
仍然无法解决"_tkinter.TclError: unknown option "-bg" "错误,即使我从所有框架中删除了.pack()。 - IPDGino
1
@kalgasnik:在您的评论中,您写道“使用'bg'的代码运行良好(python2.7和3.3)”。这是正确的,但您错过了这个答案的重点。当您使用标准的tkinter框架时,它可以工作,但OP(意外地?)使用了来自ttk包的框架,在那里它不起作用。 - Bryan Oakley
@BryanOakley 我对编程还很陌生,所以我猜这只是一个意外。不过现在它可以工作了。另外,据我所知,如果你使用 Style,就不能再使用像 bg="white" 这样的东西了,对吗?因为我在一些标签上尝试了一下,它们都报了同样的错误。 - IPDGino
@BryanOakley,在IPDGino添加导入后,我编辑了我的答案。 - kalgasnik
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接