如何在所有窗口中为组合框设置颜色

时间:2019-01-12 14:12:35

标签: python python-3.x tkinter combobox themes

我正在使用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上搜索了,没有找到任何解决方案。任何帮助将不胜感激!

1 个答案:

答案 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()