Как управлять выделением выделения со списком tkinter - PullRequest
9 голосов
/ 08 марта 2011

Я написал небольшой конвертер Фарада для изучения программирования на GUI. Он отлично работает, выглядит отлично. Единственная проблема в том, что я не могу понять, как управлять этой странной подсветкой, которая появляется на моих ttk.Combobox выборках. Я использовал ttk.Style(), но он только изменил цвета ttk.Combobox фона, записей и т. Д. Я также попытался изменить openbox/gtk темы.

what the farad

Я говорю о том, что там видно по тексту "микрофарады (мкФ)".

Было бы хорошо, если бы он выделил всю коробку; но я бы предпочел, чтобы все прошло полностью.

Как я могу манипулировать выделением ttk.Combobox?

# what the farad?
# thomas kirkpatrick (jtkiv)

from tkinter import *
from tkinter import ttk

# ze la programma.
def conversion(*args):
# this is the numerical value
inV = float(inValue.get())
# these two are the unit (farads, microfarads, etc.) values
inU = inUnitsValue.current()
outU = outUnitsValue.current()

# "mltplr" is multiplied times inValue (inV)
if inU == outU:
    mltplr = 1
else:
    mltplr = 10**((outU - inU)*3)
outValue.set(inV*mltplr)

# start of GUI code
root = Tk()
root.title("What the Farad?")

# frame
mainFrame = ttk.Frame(root, width="364", padding="4 4 8 8")
mainFrame.grid(column=0, row=0)

# input entry
inValue = StringVar()
inValueEntry = ttk.Entry(mainFrame, width="20", justify="right", textvariable=inValue)
inValueEntry.grid(column=1, row=1, sticky="W")

# input unit combobox
inUnitsValue = ttk.Combobox(mainFrame)
inUnitsValue['values'] = ('kilofarads (kF)', 'farads (F)', 'millifarads (mF)', 'microfarads (uF)', 'nanofarads (nF)', 'picofarads (pF)')
inUnitsValue.grid(column=2, row=1, sticky="e")
inUnitsValue.state(['readonly'])
inUnitsValue.bind('<<ComboboxSelected>>', conversion)

# result label
outValue = StringVar()
resultLabel = ttk.Label(mainFrame, textvariable=outValue)
resultLabel.grid(column=1, row=2, sticky="e")

# output unit combobox
outUnitsValue = ttk.Combobox(mainFrame)
outUnitsValue['values'] = ('kilofarads (kF)', 'farads (F)', 'millifarads (mF)', 'microfarads (uF)', 'nanofarads (nF)', 'picofarads (pF)')
outUnitsValue.grid(column=2, row=2, sticky="e")
outUnitsValue.state(['readonly'])
outUnitsValue.bind('<<ComboboxSelected>>', conversion)

# padding for widgets
for child in mainFrame.winfo_children(): child.grid_configure(padx=4, pady=4)

# focus
inValueEntry.focus()

# bind keys to convert (auto-update, no button)
root.bind('<KeyRelease>', conversion)

root.mainloop()

Ответы [ 2 ]

8 голосов
/ 08 марта 2011

Вы можете использовать комбинированный список selection_clear(), чтобы очистить выбор в любое время.например,

inUnitsValue.selection_clear()
6 голосов
/ 18 марта 2011

Может ли быть так, что с выпадающим списком, проблема не в выборе, а в относительно сильном индикаторе фокусировки?

С этим обходным приемом вы теряете возможность управления вашей программой с клавиатуры. Чтобы сделать это правильно, вам нужно изменить стиль подсветки фокуса.

from tkinter import *
from ttk import *

def defocus(event):
    event.widget.master.focus_set()

root = Tk()

comboBox = Combobox(root, state="readonly", values=("a", "b", "c"))
comboBox.grid()
comboBox.set("a")
comboBox.bind("<FocusIn>", defocus)

mainloop()
...