python 关于用tkinter创建的窗口和按钮,一点按钮就自己弹出新窗口是什么问题?

本文探讨了使用Python的tkinter库创建GUI应用时遇到的问题:当点击按钮时,程序意外地弹出新窗口。通过分析代码,问题出现在函数`CVS()`的调用上,该函数在按钮的`command`属性中被触发,导致每次点击按钮都会运行新窗口的代码。解决方案是正确管理窗口实例和避免在按钮回调中创建新窗口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下:

//--------------------------------主程序----------------------------------//

import tkinter

def CVS():

    import CvStrSplice

    CvStrSplice.CvStrSplice()

#窗口变量定义

win=tkinter.Tk()

#窗口属性

win.title('程序生成')#窗口名称

win.geometry("800x600+200+50")#窗口尺寸,其中尺寸中用的是x字母

#滚筒按钮定义

MotorBut=tkinter.Button(win,            

                        text='输送线',                    

                        width=6,

                        height=2,

                        command=CVS)


 

#滚筒编号字母对话框获取信息

MotorInputLe=tkinter.Entry(win)

#MotorInputLe.config(textvariable="输送线编号字母")

MotorInputLe.place(width=30,height=30)


 

#滚筒编号起始数字对话框获取信息

MotorInputNum=tkinter.Entry(win)

#MotorInputNum.config(textvariable="输送线编号数字")

MotorInputNum.place(width=30,height=30)


 

#滚筒起始ID对话框获取信息

MotorInputID=tkinter.Entry(win)

#MotorInputID.config(textvariable="输送线ID")

MotorInputID.place(width=30,height=30)


 

#滚筒循环次数对话框获取信息

MotorInputCirTime=tkinter.Entry(win)

#MotorInputCirTime.config(textvariable="输送线循环总次数")

MotorInputCirTime.place(width=30,height=30)




 

#提升机编号字母对话框获取信息

#SCarInputLe=tkinter.Entry(win)

#SCarInputLe.config(text="提升机编号字母")

#SCarInputLe.place(width=30,height=30)

#SCar_Le=SCarInputLe.get()

#提升机编号起始数字对话框获取信息

#CarInputNum=tkinter.Entry(win)

#SCarInputNum.config(text="提升机编号数字")

#SCarInputNum.place(width=30,height=30)

#SCar_Num=SCarInputNum.get()

#提升机起始ID对话框获取信息

#SCarInputID=tkinter.Entry(win)

#SCarInputID.config(text="提升机ID")

#SCarInputID.place(width=30,height=30)

#SCar_ID=SCarInputID.get()

#提升机循环次数对话框获取信息

#SCarInputCirTime=tkinter.Entry(win)

#SCarInputCirTime.config(text="提升机循环总次数")

#SCarInputCirTime.place(width=30,height=30)

#SCar_CirTime=20 #SCarInputCirTime.get()


 

#提升机程序中气缸标志位判断

#m_Cylinder=1

#if m_Cylinder :

#    SCar_CySig="TRUE"

#else:

#    SCar_CySig="FALSE"

#SCS(SCar_Le,SCar_Num,SCar_ID,SCar_CySig,SCar_CirTime)

#提升机,顶升移栽,阻挡按钮定义

#SCarBut=tkinter.Button(win,

#                       text='提升机/顶升/阻挡',    

#                       width=6,

#                       height=2,

#                       command=SCS)  #Command连接对话框函数      


 

#显示框定义

OutShow=tkinter.Text(win,width=60,height=20)


 

#显示滚动条

yscoll=tkinter.Scrollbar(win,orient=tkinter.VERTICAL,command=OutShow.yview)#垂直滚动条

OutShow.config(yscrollcommand=yscoll.set)

yscollS=tkinter.Scrollbar(win,orient=tkinter.HORIZONTAL,command=OutShow.xview)#水平滚动条

OutShow.config(xscrollcommand=yscollS.set)

#窗口元件排列

MotorBut.grid(row=0,column=0)

MotorInputLe.grid(row=1,column=0)

MotorInputNum.grid(row=2,column=0)

MotorInputID.grid(row=3,column=0)

MotorInputCirTime.grid(row=4,column=0)

#SCarBut.grid(row=0,column=1)

#SCarInputLe.grid(row=1,column=1)

#SCarInputNum.grid(row=2,column=1)

#SCarInputID.grid(row=3,column=1)

#SCarInputCirTime.grid(row=4,column=1)

OutShow.grid(row=0,column=3)

yscoll.grid(row=0,column=2,sticky = "ns")#ns为顶,底部对齐

yscollS.grid(row=1,column=3,sticky = "we")#we为左,右部对齐



 

#窗口生成显示

win.mainloop()

//--------------------------------调用程序-------------------------------//

#滚筒字符串拼接函数

def CvStrSplice():

    #在函数中导入属于延迟导入,可以消除循环导入的错误

   

    i=0

    from MainProgram import OutShow

    from MainProgram import tkinter

    from MainProgram import MotorInputCirTime

    CirTime=int(MotorInputCirTime.get())

    m_CirTime_m=float(CirTime)

    m_CirTime=int(m_CirTime_m)

   

    while i<m_CirTime:

       

        from MainProgram import MotorInputLe

        from MainProgram import MotorInputNum

        from MainProgram import MotorInputID

       

        MoLetter=MotorInputLe.get()

        MoNum=int(MotorInputNum.get())

        MoID=int(MotorInputID.get())

        #第一行 ID定义

        String1="\"Global\".CvIO"

        String2=f"{MoLetter}{MoNum+i}"   #滚筒电机全局变量编号定义

        String3=f"{String1}{String2}.diDeviceID :="

        String4=f"{MoID+i}"  #滚筒电机ID定义

        String5=";"

        m_StringF1=f"{String3}{String4}{String5}"

        #第二行 正限位定义

        String6=f"{String1}{String2}.i_xCWPresent := \"i_xPosDetect"

        String7=String2

        String8="\";"

        m_StringF2=f"{String6}{String7}{String8}"

        #第三行 负限位定义

        String9=f"{String1}{String2}.i_xCCWPresent := \"i_xNegDetect"

        String10=String2

        String11="\";"

        m_StringF3=f"{String9}{String10}{String11}"

        #第四行 正转定义

        String12=f"o_xCW"

        String13=String2

        String14=f"\" := {String1}{String2}.o_xMotorCW;"

        m_StringF4=f"{String12}{String13}{String14}"

        #第五行 反转定义

        String15=f"o_xCCW"

        String16=String2

        String17=f"\" := {String1}{String2}.o_xMotorCW;"

        m_StringF5=f"{String15}{String16}{String17}"

        #第六行 状态定义

        String18=f"\"State\"."

        String19=String2

        String20=f" := {String1}{String2}.wState;"

        m_StringF6=f"{String18}{String19}{String20}"

        #第七行 功能块定义1

        String21=f"#Cv{String2}(CvIO := {String1}{String2},"

        m_StringF7=String21

        #第八行 功能块定义2

        String22=f"\tHMI := \"HMI\".PV1);"

        m_StringF8=String22

        #输出字符串

        result=(f"{m_StringF1}\n{m_StringF2}\n{m_StringF3}\n{m_StringF4}"

              f"\n{m_StringF5}\n{m_StringF6}\n{m_StringF7}\n{m_StringF8}\n")

       

        Cvresult=result

        OutShow.insert(tkinter.END,f"{Cvresult}\n")

        #循环自加

        i+=1

        #循环次数到达后退出

        if i>=m_CirTime:

            break


求大神们解答一下!!谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值