有没有一种方法可以确保在选择子窗口小部件时突出显示的父窗口小部件保持突出显示

时间:2019-08-07 18:19:35

标签: python-3.x tkinter highlight

我有一个单选按钮,突出显示了相应的LabelFrame。

每个LabelFrame都有一个Entry小部件作为子级。 选择“输入”小部件以键入某些输入时,父LabelFrame会丢失给定的高亮背景颜色(从青色到灰色),但保持相同的高亮厚度。

有没有办法保持给定的高亮背景颜色?

(Windows 7 64,pycharm 2019.2)

谢谢。

from tkinter import *
from tkinter import ttk
import tkinter as tk


class doSomeStuff(Tk):
    def __init__(self):
        Tk.__init__(self)

        self.radioBtnVar = StringVar()  # radiobutton variable

        # main canvas

        pwdCanvas = tk.Canvas(self, bd=0, highlightthickness=0)
        pwdCanvas.pack()

        # choiceLabelFrame
        choiceLabelFrame = ttk.LabelFrame(pwdCanvas, text='Choice LabelFrame (ttk)')
        choiceLabelFrame.grid(column=0, row=11, columnspan=2, sticky='nsew')

        # radio button 1
        rbtn1 = ttk.Radiobutton(choiceLabelFrame, text='A', variable=self.radioBtnVar, value='PCG', command=self.colorLabels)
        rbtn1.pack(side='left')

        # radio button 2
        rbtn2 = ttk.Radiobutton(choiceLabelFrame, text='B', variable=self.radioBtnVar, value='UG', command=self.colorLabels)
        rbtn2.pack(side='right')

        # LabelFrame1, left side
        self.LabelFrame1 = tk.LabelFrame(pwdCanvas, text="LabelFrame 1 (tk)", bd=0)  # I use tk to have access to the 'highlightbackground' option
        self.LabelFrame1.grid(column=0, row=12, sticky='nsew', padx=3, pady=3)

        entry1Label = ttk.Label(self.LabelFrame1, text='Entry 1')
        entry1Label.grid(column=0, row=11, sticky='w')

        self.labelEntry1 = ttk.Entry(self.LabelFrame1, state='disabled')
        self.labelEntry1.grid(column=1, row=11, sticky='w')

        # LabelFrame2, right side
        self.LabelFrame2 = tk.LabelFrame(pwdCanvas, text="LabelFrame 2 (tk)", bd=0)
        self.LabelFrame2.grid(column=1, row=12, sticky='nw', padx=3, pady=3)

        entry2Label = ttk.Label(self.LabelFrame2, text='Entry 2')
        entry2Label.grid(column=0, row=0)

        labelEntry2 = ttk.Entry(self.LabelFrame2, state='disabled')
        labelEntry2.grid(column=1, row=0)

    def colorLabels(self):  # activates and highlights the chosen option
        if self.radioBtnVar.get() == 'PCG':
            for child in self.LabelFrame1.winfo_children():
                child.config(state='enabled')
            self.LabelFrame1.config(highlightbackground='cyan', highlightthickness=2)

            for child in self.LabelFrame2.winfo_children():
                child.config(state='disabled')
            self.LabelFrame2.config(highlightthickness=0)

        elif self.radioBtnVar.get() == 'UG':
            for child in self.LabelFrame2.winfo_children():
                child.config(state='enabled')
            self.LabelFrame2.config(highlightbackground='cyan', highlightthickness=2)

            for child in self.LabelFrame1.winfo_children():
                child.config(state='disabled')
            self.LabelFrame1.config(highlightthickness=0)


if __name__ == "__main__":
    app = doSomeStuff()
    app.mainloop()

2 个答案:

答案 0 :(得分:0)

highlightthickness属性专门用于突出显示具有键盘焦点的窗口小部件。当用户使用键盘遍历UI时,它可以为用户提供提示。

因为它直接与哪个窗口小部件具有焦点相关,并且因为您一次只能将焦点放在一个窗口小部件上,所以无法一次使用该功能突出显示一件事。

答案 1 :(得分:0)

我已经找到一种获取我想要的东西的方法。

    def colorLabels(self):
        if self.radioBtnVar.get() == 'PCG':
            for child in self.LabelFrame1.winfo_children():
                child.config(state='enabled')
            self.LabelFrame1.config(highlightbackground='cyan', highlightcolor='cyan', highlightthickness=2)

            for child in self.LabelFrame2.winfo_children():
                child.config(state='disabled')
            self.LabelFrame2.config(highlightthickness=0)

        elif self.radioBtnVar.get() == 'UG':
            for child in self.LabelFrame2.winfo_children():
                child.config(state='enabled')
            self.LabelFrame2.config(highlightbackground='cyan', highlightcolor='cyan', highlightthickness=2)

            for child in self.LabelFrame1.winfo_children():
                child.config(state='disabled')
            self.LabelFrame1.config(highlightthickness=0)

我只是添加了“ highlightcolor =”青色”。 如此处effbot.org所述:

  • “高光背景”在小部件没有焦点时使用。

  • 当控件具有焦点时,使用
  • 'highlightcolor'。

这样,即使未聚焦,我的小部件也可以保持突出显示的轮廓。