Tkinter按钮未点击却自动执行关联函数的问题排查
问题分析与解决方案
问题根源
你遇到的问题是因为创建新窗口按钮时,直接使用了command=btnrepress(sb)的写法——这种写法会立即执行btnrepress(sb)函数,而非将其绑定为按钮的点击回调。括号()会触发函数的即时调用,而不是传递函数对象供后续点击时触发。
解决方案
使用lambda表达式包装带参数的函数调用,确保只有按钮被点击时才执行目标函数。同时,Toplevel窗口无需单独调用mainloop(),主窗口的window.mainloop()已能管理所有子窗口的事件循环。
修改两处关键代码:
- 替换按钮的
command参数:
# 原代码 nwbtn = Button(nw, text="실행", width=30, command=btnrepress(sb)) # 修改为 nwbtn = Button(nw, text="실행", width=30, command=lambda: btnrepress(sb))
- 删除Toplevel中的
nw.mainloop()语句。
修改后的完整代码
from tkinter import * import os window = Tk() window.geometry("600x400") window.title("타이머") window.resizable(False, False) hb = 0 mb = 0 sb = 0 hbc = 0 mbc = 0 sbc = 0 def btnrepress(x): # os.system(f"shutdown -s -t {x}") os.system("ver") def btnpress(): global hb, mb, sb, hbc, mbc, sbc hb = ht.get() mb = mt.get() sb = st.get() hbc = int(hb) mbc = int(mb) sbc = int(sb) sb = sbc + hbc*3600 + mbc*60 nw = Toplevel() nw.geometry("200x100") nw.title("재확인") nw.resizable(False,False) nwl = Label(nw) nwl.config(text=str(hbc) + "시간" + str(mbc) + "분" + str(sbc) + "초") nwl.pack() nwbtn = Button(nw, text="실행", width=30, command=lambda: btnrepress(sb)) nwbtn.pack() ts = Label(window) ts.config(text="시간: ") ts.place(x=130,y=80) ts2 = Label(window) ts2.config(text="분: ") ts2.place(x=240,y=80) ts3 = Label(window) ts3.config(text="초: ") ts3.place(x=340,y=80) tl = Label(window) tl.config(text="") tl.place(x=220,y=10) ht = Entry(window) ht.insert(0, "0") ht.config(width=8) ht.place(x=170,y=80) mt = Entry(window) mt.insert(0, "0") mt.config(width=8) mt.place(x=270,y=80) st = Entry(window) st.insert(0, "0") st.config(width=8) st.place(x=370,y=80) btn = Button(window) btn.config(text = "실행예약") btn.config(width=30) btn.config(command=btnpress) btn.place(x=190,y=100) window.mainloop()
补充:添加了global声明,确保btnpress函数能正确修改全局变量(若后续需要复用这些变量)。
内容的提问来源于stack exchange,提问作者lsm
相关产品推荐
相关产品推荐

