如何实现Tkinter Entry组件字符限制与文本自动缩放优化显示
实现Entry输入限制与字号自动调整的Tkinter程序
以下是修改后的完整代码,实现了限制Entry组件输入字符数量和输入时自动缩小字号的功能,同时修正了原代码中的输入验证逻辑错误:
import matplotlib.pyplot as plt import numpy as np import tkinter as tk from tkinter import * root = tk.Tk() root.config(bg='white') root.state('zoomed') x = np.arange(-10, 11, 1) root.title('Fonksiyonlar') c1 = Canvas(height=600, width=1100, bg='gray97') import time errortext = tk.Label(text='Girdiğiniz Sayıları Kontrol Ediniz', font='Calibri 25') def gos(): errortext.place_forget() # 通用函数:创建带输入限制和字号自动调整的Entry def create_restricted_entry(max_chars, initial_font_size=40, min_font_size=12): # 输入验证函数:限制字符数量 def validate_input(new_text): # 允许删除操作(new_text为空),或者长度不超过max_chars if len(new_text) <= max_chars or new_text == "": return True return False # 字号调整函数:根据输入长度动态调整字体大小 def adjust_font_size(event): current_text = event.widget.get() text_length = len(current_text) # 计算字号:每增加2个字符,字号减5,不低于最小字号 new_size = max(initial_font_size - (text_length // 2) * 5, min_font_size) event.widget.config(font=f'Calibri {new_size}') # 注册验证命令 validate_cmd = root.register(validate_input) # 创建Entry entry = tk.Entry(highlightcolor='blue', bg='pink', font=f'Calibri {initial_font_size}') # 设置输入验证 entry.config(validate="key", validatecommand=(validate_cmd, '%P')) # 绑定字号调整事件 entry.bind('<KeyRelease>', adjust_font_size) return entry def b1c(): def b3g(): # 修正输入验证逻辑:检查每个字符是否为数字或小数点 input_text = e1.get() for i in input_text: if i not in '0123456789.': e1.delete(0, END) errortext.place(x=300, y=200) root.after(3000, gos) break # 找到非法字符后直接退出循环 bbir.destroy() biki.destroy() c1.destroy() # 使用通用函数创建带限制的Entry,最多允许8个字符 e1 = create_restricted_entry(max_chars=8) e1.place(width=230, height=230, x=80, y=300) bşş = tk.Button(text='TAMAM', command=b3g) bşş.pack() lx2 = tk.Label(text='x² + ', font='Calibri 150', bg='white') lx2.place(x=350, y=300) e2 = create_restricted_entry(max_chars=8) e2.place(width=230, height=230, x=700, y=300) lx3 = tk.Label(text='x +', font='Calibri 150', bg='white') lx3.place(x=1000, y=300) e3 = create_restricted_entry(max_chars=8) e3.place(width=230, height=230, x=1280, y=300) lx4 = tk.Label(text='=', font='Calibri 150', bg='white') lx4.place(x=1550, y=300) e4 = create_restricted_entry(max_chars=8) e4.place(width=230, height=230, x=1680, y=300) # 数字键盘按钮部分保持不变 b1 = tk.Button(text='1', padx=20, pady=20, font='Calibri 20') b1.place(x=850, y=570) b2 = tk.Button(text='2', padx=20, pady=20, font='Calibri 20') b2.place(x=950, y=570) b3 = tk.Button(text='3', padx=20, pady=20, font='Calibri 20') b3.place(x=1050, y=570) b4 = tk.Button(text='4', padx=20, pady=20, font='Calibri 20') b4.place(x=850, y=700) b5 = tk.Button(text='5', padx=20, pady=20, font='Calibri 20') b5.place(x=950, y=700) b6 = tk.Button(text='6', padx=20, pady=20, font='Calibri 20') b6.place(x=1050, y=700) b7 = tk.Button(text='7', padx=20, pady=20, font='Calibri 20') b7.place(x=850, y=820) b8 = tk.Button(text='8', padx=20, pady=20, font='Calibri 20') b8.place(x=950, y=820) b9 = tk.Button(text='9', padx=20, pady=20, font='Calibri 20') b9.place(x=1050, y=820) b0 = tk.Button(text='0', padx=75, pady=20, font='Calibri 15') b0.place(x=850, y=930) beş = tk.Button(text='=', padx=22, pady=20, font='Calibri 20') beş.place(x=1050, y=930) bar = tk.Button(text='+', padx=20, pady=20, font='Calibri 20') bar.place(x=1150, y=570) bek = tk.Button(text='-', padx=22, pady=20, font='Calibri 20') bek.place(x=1150, y=700) bb = tk.Button(text='/', padx=22, pady=20, font='Calibri 20') bb.place(x=1150, y=930) bç = tk.Button(text='*', padx=20, pady=20, font='Calibri 20') bç.place(x=1150, y=820) print(e1.select_present()) c1.place(x=420, y=170) bbir = Button(text='1.dereceden denklemler', bg='gray91', padx=300, pady=30, font='Calibri 30', command=b1c) bbir.place(x=450, y=300) biki = Button(text='2.dereceden denklemler', bg='gray91', padx=300, pady=30, font='Calibri 30') biki.place(x=450, y=500) def hesapla(a, b, c): return a * x ** 2 + b * x + c m = 0.5 * x + x ** 2 + 5 plt.plot(x, hesapla(0, 0, 0)) plt.grid() plt.show()
功能实现说明
1. 限制Entry输入字符数量
- 编写
validate_input函数,通过Tkinter的register方法注册为验证命令,绑定到Entry的validatecommand参数 - 设置
validate="key",确保每次按键输入时都触发验证 - 验证逻辑:允许输入的字符长度不超过设定的
max_chars(此处设为8),同时允许删除操作(输入为空时返回True)
2. 自动调整文本字号
- 编写
adjust_font_size函数,绑定到Entry的<KeyRelease>事件,每次输入或删除字符后触发 - 逻辑:根据当前输入的文本长度计算字号,初始字号为40,每增加2个字符字号减5,最小字号限制为12,避免字号过小无法阅读
- 通过
event.widget.config()动态修改Entry的字体大小
3. 修正原代码的输入验证逻辑
- 原代码中
if i != '0' or '1' or ...的逻辑错误,改为if i not in '0123456789.',正确判断输入字符是否为数字或小数点 - 找到非法字符后立即退出循环,避免重复提示错误
内容的提问来源于stack exchange,提问作者junior mehmet2
相关产品推荐
相关产品推荐

