python - 基于另一个条目小部件的内容更新条目小部件

标签 python tkinter tkinter-entry

我的代码包含两个条目小部件,它们应该保存图像的高度和宽度。 当用户在两个小部件之一中输入数字来调整高度或宽度时,另一个的值应该根据输入的值和固定的纵横比进行调整。

我的第一个方法是将更新函数绑定(bind)到按键事件,但我遇到了导致在更改文本变量之前执行绑定(bind)函数的错误。此处描述了该问题:Tkinter, update Entry widget before calling <Key> binding .建议的解决方案是使用变量跟踪而不是按键事件绑定(bind)。但是,由于在我的例子中,一个变量的更改会执行一个更改另一个变量的函数,因此我希望这些函数在无限循环中相互执行。这不会发生,但肯定不会产生预期的结果。

import tkinter as tk
import tkinter.ttk as ttk

class App:

    def __init__(self, master, aspect_ratio):
        self.master = master
        self.aspect_ratio = aspect_ratio
        self.shape_x = tk.DoubleVar()
        self.shape_y = tk.DoubleVar()
        self.shape_x.trace('w', self.update_y)
        self.shape_y.trace('w', self.update_x)

        # Entry for x dimension
        self.entry_x = ttk.Entry(self.master, textvariable=self.shape_x, width=5)
        self.entry_x.pack(side='left', fill='x', expand='yes')

        # Label for multiplication sign
        self.entry_label = tk.Label(self.master, text='x', fg='gray')
        self.entry_label.pack(side='left')

        # Entry for y dimension
        self.entry_y = ttk.Entry(self.master, textvariable=self.shape_y, width=5)
        self.entry_y.pack(side='left', fill='x', expand='yes')

    def update_x(self, *args):
        self.shape_x.set(self.shape_y.get() * self.aspect_ratio)

    def update_y(self, *args):
        self.shape_y.set(self.shape_x.get() / self.aspect_ratio)

if __name__ == '__main__':        
    root = tk.Tk()
    app = App(master=root, aspect_ratio=2)
    root.mainloop()

实现我所寻找的目标的正确方法是什么?

编辑:将 update_y 中的 * 替换为/

最佳答案

可以说,最简单的解决方案是绑定(bind) <KeyRelease>事件,因为修改发生在按键按下上。这样,您就不需要使用 textvariable 的开销了。属性。

self.entry_x.bind("<Any-KeyRelease>", self.update_y)
self.entry_y.bind("<Any-KeyRelease>", self.update_x)

关于python - 基于另一个条目小部件的内容更新条目小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58380092/

相关文章:

python - 您如何将十进制数拆分为小数点以获得分钟和秒? Python

python - 查找所有 tkinter 字体

python - 将所有 tk.Button 对象添加到配置列表中

python - 如果有很多小部件,则使按钮向左对齐

python - 是否可以像在 Entry 中一样通过单击来更改 canvas.create_text 中的内容?

python - 当我将存档导入其他代码时,Tkinter Entry 为 0

python - 将 pygame 2d 水波纹转换为 pyOpenGL

javascript - 使用 .forEach() 动态生成数组

python - 如何在 matplotlib 中将次轴图安排在主轴图下方?

python - 在 Tkinter 中制作一个粘到东方、西方和南方的小部件