Как установить цвет для Combobox во всех окнах - PullRequest
0 голосов
/ 12 января 2019

Я работал над графическим интерфейсом, используя TKinter (в Python 3). Когда я закончил, я хотел установить цвет для всех виджетов. У меня не было проблем с изменением цвета виджетов «Текст» и «Кнопка», я просто использовал параметр bg:

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

Затем я попытался установить цвет ttk.Combobox виджетов, я заметил, что у них нет этой опции, поэтому я, наконец, изменил их цвет, используя темы, как описано в этом посте: Как установить фон цвет ттк. Cobobox . Но у меня была проблема с применением темы ко всем окнам. Как вы увидите, если вы попробуете следующий код, тема применяется только к 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, так что извините, если я сделал глупую ошибку. Я искал в Интернете и не нашел никакого решения. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 12 января 2019

Наличие более одного экземпляра Tk в программе - это большое число. Прочитайте этот ответ . Цитирую это здесь:

Каждой программе tkinter требуется ровно один экземпляр Tk. Tkinter - это оболочка встроенного интерпретатора tcl. Каждый экземпляр Tk получает свою собственную копию интерпретатора, поэтому два экземпляра Tk имеют два разных пространства имен.

Если вам нужно несколько окон, создайте один экземпляр Tk, а затем дополнительные окна должны быть экземплярами Toplevel.

Итак, если вам нужно несколько окон, используйте Toplevel. Вот пример.

P.S. Для оформления виджета ttk прочитайте документы . Это можно легко сделать, используя .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()
...