我正在使用TKinter(在Python 3中)开发GUI。完成后,我想为所有小部件设置颜色。更改文本和按钮小部件的颜色没有任何问题,我只使用了bg
选项:
t = Text(master, wrap = WORD, bg = '#ffffb3')
然后,我尝试设置ttk.Combobox
小部件的颜色,我注意到它们没有此选项,因此我最终使用主题更改了它们的颜色,如本帖子How to set the background color of a ttk.Combobox中所述。但是我在将主题应用于所有窗口时遇到了问题。如您所见,如果您尝试下面的代码,则该主题仅适用于第一个窗口中的组合框,而不适用于按下按钮时创建的窗口中的组合框:
from tkinter import *
from tkinter import ttk
r = Tk()
def callback():
r2 = Tk()
c2 = ttk.Combobox(r2)
c2.pack()
b = Button(r, text = 'Open', command = callback)
b.pack()
combostyle = ttk.Style()
combostyle.theme_create('combostyle', parent = 'alt', settings = {'TCombobox':{'configure':
{'fieldbackground': '#ffff99', 'background': '#ffcc66'}}})
combostyle.theme_use('combostyle')
c = ttk.Combobox(r)
c.pack()
r.mainloop()
那是我第一次在TKinter中使用主题,所以如果我犯了一个愚蠢的错误,请原谅我。我已经在Internet上搜索了,没有找到任何解决方案。任何帮助将不胜感激!
答案 0 :(得分:1)
程序中不止一个Tk
实例是一个很大的问题。阅读this answer。在这里引用:
每个tkinter程序仅需要一个Tk实例。 Tkinter是嵌入式tcl解释器的包装。每个Tk实例都有自己的解释器副本,因此两个Tk实例具有两个不同的命名空间。
如果需要多个窗口,请创建一个Tk实例,然后其他窗口应该是Toplevel的实例。
因此,如果需要多个窗口,请使用Toplevel
。这是一个例子。
P.S。要设置ttk
小部件的样式,请阅读docs。使用.configure()
中的ttk.Style()
可以轻松完成此操作。
import tkinter as tk
import tkinter.ttk as ttk
r = tk.Tk()
def callback():
r2 = tk.Toplevel()
c2 = ttk.Combobox(r2, style='ARD.TCombobox')
c2.pack()
b = tk.Button(r, text = 'Open', command = callback)
b.pack()
combostyle = ttk.Style()
combostyle.configure('ARD.TCombobox', background="#ffcc66", fieldbackground="#ffff99")
c = ttk.Combobox(style='ARD.TCombobox')
c.pack()
r.mainloop()