Python Tkinter - опция базы данных работает только частично - PullRequest
2 голосов
/ 21 сентября 2019

Я делаю графический интерфейс с темной темой и хотел бы сэкономить время, установив параметры по умолчанию, используя базу данных параметров, но работают только некоторые из параметров.Такие параметры, как «фон» и «шрифт», работают правильно, но другие вещи, такие как изменение активного фона или выбора цвета для радиопереключателя, НЕ работают.Изменение «insertbackground» в виджете ввода также не работает.

Я не уверен, почему некоторые опции работают, а другие нет.Если я передаю те же параметры при создании виджета, он работает.Например:

myRadio = Radiobutton(frame, selectcolor='#FF0000', **otherKwargs)

Я пробовал это двумя способами.

import tkinter
from tkinter import Tk, ttk, Frame, Entry, Label, Button, Toplevel, BooleanVar, IntVar, Radiobutton, StringVar, Canvas
mw  = Tk()

mw.option_readfile('StyleDatabase.txt')

# code here...

mw.mainloop()

Файл "StyleDatabase.txt" содержит следующее:

*background: #000008
*foreground: grey90
*font: '', 11
*Entry*background: #404050
*Radiobutton*selectcolor: #FF0000  <---- This one doesn't work.

# also tried:
*selectcolor: #FF0000
*Radiobutton.selectcolor: #FF0000 <---- Neither worked

Я также пытался использовать функцию mw.option_add (), ничего из следующего не работало:

mw.option_add('*selectbackground', 'blue')
mw.option_add('*Radiobutton*selectbackground', 'blue')
mw.option_add('*Radiobutton.selectbackground', 'blue')

Насколько я знаю, других способов сделать это не существует.

РЕДАКТИРОВАТЬ: Вот работающий скрипт, демонстрирующий проблему, Python 3.x

import tkinter
from tkinter import Tk, ttk, Frame, Entry, Label, Button, Toplevel, BooleanVar, IntVar, Radiobutton, StringVar, Canvas

class MainUI:
    def __init__(self, master):
        self.master = master 

        Label(self.master, text='Hello').pack(side='top')

        Entry(self.master).pack(side='top')
        Entry(self.master, insertbackground='red').pack(side='top')

        Button(self.master, text='Cyan Button').pack(side='top')

mw = Tk()

mw.option_add('*background', 'blue') # works
mw.option_add('*foreground', 'white') # works
mw.option_add('*Button.foreground', 'cyan') # works

mw.option_add('*insertbackground', 'red') # does not work. Works if i pass the argument in when creating the widget.
mw.option_add('*Entry.insertbackground', 'red') # also does not work
mw.option_add('*Entry*insertbackground', 'red') # also does not work

mainUI = MainUI(mw)

mw.mainloop()

1 Ответ

2 голосов
/ 21 сентября 2019

Вопрос : база данных опций работает только частично

Вы застряли с разными именами опций и псевдонимами, используемыми tkinter и базовым Tcl.


Ваш опционный параметр должен быть note upercase Color:

*Radiobutton*selectColor: #FF0000

Вы можете получить используемое имя.option_readfile или .option_add из .config:

myRadio = tk.Radiobutton(frame, selectcolor='#FF0000', **otherKwargs)
myRadio.grid()

print('{}'.format(myRadio.config()['selectcolor']))

>>> ('selectcolor', 'selectColor', 'Background', '#ffffff', '#FF0000')

Этот ответ Каковы эти странные параметры, возвращаемые методом configure? , объясняеткаждая опция из пяти значений.

Имя Second , здесь 'selectColor', используются базой данных опций.


Примечание : Опции не отображаются из <widget instance>.config() не могут быть установлены.

Протестировано с Python: 3,5 -«TclVersion»: 8,6 «TkVersion»: 8,6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...