本文整理汇总了Python中tkinter.StringVar.trace_add方法的典型用法代码示例。如果您正苦于以下问题:Python StringVar.trace_add方法的具体用法?Python StringVar.trace_add怎么用?Python StringVar.trace_add使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类tkinter.StringVar
的用法示例。
在下文中一共展示了StringVar.trace_add方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: make_color_swatch
# 需要导入模块: from tkinter import StringVar [as 别名]
# 或者: from tkinter.StringVar import trace_add [as 别名]
def make_color_swatch(parent: tk.Frame, var: tk.StringVar, size=16) -> ttk.Label:
"""Make a single swatch."""
# Note: tkinter requires RGB as ints, not float!
def get_color():
"""Parse out the color."""
color = var.get()
if color.startswith('#'):
try:
r = int(color[1:3], base=16)
g = int(color[3:5], base=16)
b = int(color[5:], base=16)
except ValueError:
LOGGER.warning('Invalid RGB value: "{}"!', color)
r = g = b = 128
else:
r, g, b = map(int, Vec.from_str(color, 128, 128, 128))
return r, g, b
def open_win(e):
"""Display the color selection window."""
widget_sfx()
r, g, b = get_color()
new_color, tk_color = askcolor(
color=(r, g, b),
parent=parent.winfo_toplevel(),
title=_('Choose a Color'),
)
if new_color is not None:
r, g, b = map(int, new_color) # Returned as floats, which is wrong.
var.set('{} {} {}'.format(int(r), int(g), int(b)))
swatch = ttk.Label(
parent,
relief='raised',
)
def update_image(var_name: str, var_index: str, operation: str):
r, g, b = get_color()
swatch['image'] = img.color_square(round(Vec(r, g, b)), size)
update_image('', '', '')
# Register a function to be called whenever this variable is changed.
var.trace_add('write', update_image)
utils.bind_leftclick(swatch, open_win)
return swatch
示例2: widget_minute_seconds
# 需要导入模块: from tkinter import StringVar [as 别名]
# 或者: from tkinter.StringVar import trace_add [as 别名]
def widget_minute_seconds(parent: tk.Frame, var: tk.StringVar, conf: Property) -> tk.Widget:
"""A widget for specifying times - minutes and seconds.
The value is saved as seconds.
Max specifies the largest amount.
"""
max_value = conf.int('max', 60)
min_value = conf.int('min', 0)
if min_value > max_value:
raise ValueError('Bad min and max values!')
values = timer_values(min_value, max_value)
# Stores the 'pretty' value in the actual textbox.
disp_var = tk.StringVar()
existing_value = var.get()
def update_disp(var_name: str, var_index: str, operation: str) -> None:
"""Whenever the string changes, update the displayed text."""
seconds = conv_int(var.get(), -1)
if min_value <= seconds <= max_value:
disp_var.set('{}:{:02}'.format(seconds // 60, seconds % 60))
else:
LOGGER.warning('Bad timer value "{}" for "{}"!', var.get(), conf['id'])
# Recurse, with a known safe value.
var.set(values[0])
# Whenever written to, call this.
var.trace_add('write', update_disp)
def set_var():
"""Set the variable to the current value."""
try:
minutes, seconds = disp_var.get().split(':')
var.set(str(int(minutes) * 60 + int(seconds)))
except (ValueError, TypeError):
pass
def validate(reason: str, operation_type: str, cur_value: str, new_char: str, new_value: str):
"""Validate the values for the text.
This is called when the textbox is modified, to allow cancelling bad
inputs.
Reason is the reason this was fired: 'key', 'focusin', 'focusout', 'forced'.
operation_type is '1' for insert, '0' for delete', '-1' for programmatic changes.
cur_val is the value before the change occurs.
new_char is the added/removed text.
new_value is the value after the change, if accepted.
"""
if operation_type == '0' or reason == 'forced':
# Deleting or done by the program, allow that always.
return True
if operation_type == '1': # Inserted text.
# Disallow non number and colons
if new_char not in '0123456789:':
return False
# Only one colon.
if ':' in cur_value and new_char == ':':
return False
# Don't allow more values if it has more than 2 numbers after
# the colon - if there is one, and it's not in the last 3 characters.
if ':' in new_value and ':' not in new_value[-3:]:
return False
if reason == 'focusout':
# When leaving focus, apply range limits and set the var.
try:
str_min, str_sec = new_value.split(':')
seconds = int(str_min) * 60 + int(str_sec)
except (ValueError, TypeError):
seconds = min_value
else:
if seconds < min_value:
seconds = min_value
if seconds > max_value:
seconds = max_value
var.set(str(seconds)) # This then re-writes the textbox.
return True
validate_cmd = parent.register(validate)
spinbox = tk.Spinbox(
parent,
exportselection=False,
textvariable=disp_var,
command=set_var,
wrap=True,
values=values,
width=5,
validate='all',
# These define which of the possible values will be passed along.
# http://tcl.tk/man/tcl8.6/TkCmd/spinbox.htm#M26
validatecommand=(validate_cmd, '%V', '%d', '%s', '%S', '%P'),
)
# We need to set this after, it gets reset to the first one.
#.........这里部分代码省略.........