请教下,如何控制Python的tkinter库的entry控件的宽度

img


如图,自己尝试写个简单小工具,可是entry_set_hour控件的左右两侧的空白部分宽度会跟随上一行控件entry_text的宽度变化而变化(2~16),如何让entry_set_hour控件像右侧的两个控件一样进行布局排版?

img


代码如下

from re import fullmatch
from datetime import datetime
from pyperclip import copy
from pyautogui import hotkey
from schedule import every
from tkinter import Button, Entry, Frame, Label, messagebox, Tk


def schedule_task():
    text = entry_text.get().replace(" ", "\t")
    hour_str = entry_set_hour.get()
    minute_str = entry_set_minute.get()
    second_str = entry_set_second.get()

    if not fullmatch(r'^[0-2]\d:[0-5]\d:[0-5]\d$', f"{hour_str}:{minute_str}:{second_str}"):
        messagebox.showerror("时间格式错误!", "请重新输入:")
        return

    target_time = datetime.now().replace(
        hour=int(hour_str),
        minute=int(minute_str),
        second=int(second_str),
        microsecond=0
    )

    copy(text=text)
    every().day.at(target_time.strftime("%H:%M:%S")).do(lambda: hotkey("ctrl", "v"))


def execute_task():
    messagebox.showinfo("提示", "开始执行")
    start_button.config(state="disabled")

    schedule_task()

    start_button.config(state="normal")
    messagebox.showinfo("提示", "已完成")


win = Tk()
win.geometry("480x360")
win.title("定时粘贴")

frame = Frame(win)
frame.pack(padx=15, pady=15)

label_text = Label(frame, text="输入文本:", font=("SimSun", 18))
label_text.grid(row=0, column=0, padx=10, pady=10)
# entry_text = Entry(frame, font=("SimSun", 2))
entry_text = Entry(frame, font=("SimSun", 16))
entry_text.grid(row=0, column=1, padx=10, pady=10)

label_set_time = Label(frame, text="设定时间:", font=("SimSun", 18))
label_set_time.grid(row=1, column=0, padx=10, pady=20)

entry_set_hour = Entry(frame, font=("SimSun", 16), width=2)
entry_set_hour.grid(row=1, column=1, padx=2, pady=20)
label_set_hour = Label(frame, text="时", font=("SimSun", 12))
label_set_hour.grid(row=1, column=2, padx=0, pady=20)

entry_set_minute = Entry(frame, font=("SimSun", 16), width=2)
entry_set_minute.grid(row=1, column=3, padx=2, pady=20)
label_set_minute = Label(frame, text="分", font=("SimSun", 12))
label_set_minute.grid(row=1, column=4, padx=0, pady=20)

entry_set_second = Entry(frame, font=("SimSun", 16), width=2)
entry_set_second.grid(row=1, column=5, padx=2, pady=20)
label_set_second = Label(frame, text="秒", font=("SimSun", 12))
label_set_second.grid(row=1, column=6, padx=0, pady=20)

start_button = Button(frame, text="开始", font=("SimSun", 36), command=execute_task, state="normal")
start_button.grid(row=2, column=0, pady=10)

win.mainloop()

img

【以下回答由 GPT 生成】

首先,我们需要使用grid布局管理器来控制entry_set_hour控件的宽度。然后,我们可以设置其columnspan属性为2,使其跨越两列,从而保持固定宽度。在代码中,我们需要将entry_set_hour的grid调用改为如下所示:

entry_set_hour.grid(row=0, column=2, columnspan=2)

修改后的代码如下:

from re import fullmatch
from datetime import datetime
from pyperclip import copy
from pyautogui import hotkey
from schedule import every
from tkinter import Button, Entry, Frame, Label, messagebox, Tk

def schedule_task():
    text = entry_text.get().replace(" ", "\t")
    hour_str = entry_set_hour.get()
    minute_str = entry_set_minute.get()
    second_str = entry_set_second.get()

    if not fullmatch(r'^[0-2]\d:[0-5]\d:[0-5]\d$', f"{hour_str}:{minute_str}:{second_str}"):
        messagebox.showerror("时间格式错误!", "请重新输入:")
        return

    target_time = datetime.now().replace(
        hour=int(hour_str),
        minute=int(minute_str),
        second=int(second_str),
        microsecond=0
    )

    copy(text=text)
    every().day.at(target_time.strftime("%H:%M:%S")).do(lambda: hotkey("ctrl", "v"))

def execute_task():
    messagebox.showinfo("提示", "开始执行")
    start_button.config(state="disabled")

    schedule_task()

    start_button.config(state="normal")
    messagebox.showinfo("提示", "已完成")

win = Tk()
win.geometry("480x360")
win.title("定时粘贴")

frame = Frame(win)
frame.pack(padx=15, pady=15)

label_text = Label(frame, text="输入文本:", font=("SimSun", 18))
label_text.grid(row=0, column=0, padx=10, pady=10)
entry_text = Entry(frame, font=("SimSun", 16))
entry_text.grid(row=0, column=1)

entry_set_hour = Entry(frame, width=2, font=("SimSun", 16))
entry_set_hour.grid(row=0, column=2, columnspan=2)

这样,entry_set_hour控件的宽度将固定为2个字符的宽度,不再随上一行控件的宽度变化而变化。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^