【问题标题】:How to set a color for a Combobox in all windows如何在所有窗口中为组合框设置颜色
【发布时间】:2019-01-12 14:12:35
【问题描述】:

我正在使用 TKinter(在 Python 3 中)开发 GUI。完成后,我想为所有小部件设置颜色。更改 Text 和 Button 小部件的颜色没有任何问题,我只是使用了 bg 选项:

t = Text(master, wrap = WORD, bg = '#ffffb3')

然后,我尝试设置 ttk.Combobox 小部件的颜色,我注意到它们没有此选项,所以我最终使用主题更改了它们的颜色,如本文所述:How to set the background color of a ttk.Combobox。但是我在将主题应用于所有窗口时遇到了问题。如果您尝试以下代码,您将看到,主题仅适用于第一个窗口中的 Combobox,但不适用于按下按钮时创建的窗口中的 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 中使用主题,如果我犯了一个愚蠢的错误,请原谅我。我已经通过互联网搜索并没有找到任何解决方案。任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    在一个程序中拥有多个Tk 实例是一个很大的问题。阅读this answer。在这里引用它:

    每个 tkinter 程序都需要一个 Tk 实例。 Tkinter 是嵌入式 tcl 解释器的包装器。每个 Tk 实例都有自己的解释器副本,因此两个 Tk 实例有两个不同的命名空间。

    如果您需要多个窗口,请创建一个 Tk 实例,然后其他窗口应该是 Toplevel 的实例。

    因此,如果您需要多个窗口,请使用Toplevel。这是一个例子。

    附:要设置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()
    

    【讨论】:

    • 感谢您的帮助!这解决了我的问题。我不知道我只能拥有一个 Tk 实例。
    猜你喜欢
    • 2016-09-08
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多