You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:10:54