鱼C论坛

 找回密码
 立即注册
查看: 5246|回复: 6

用tkinter的问题,我在点右上角关闭的时候,给我报了个错,求大神解决

[复制链接]
发表于 2015-8-13 09:20:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我用tkinter做了个发包的计数器(暂时是界面)

为了能在界面实时刷新数字计数,多做了个线程。但是我在关闭界面的时候,给我报了个错

界面

界面



报错

报错


我在代码里面有写析构方法,__del__(),准备在我关闭界面的时候,将循环变量设置为False,然后关闭循环。但是好像没效果。

虽然这个报错不影响我什么,但是有报错就是不爽,求大神能提供个思路,解决这种报错


  1. from tkinter import *
  2. import threading
  3. import time

  4. class Gui:
  5.     def __init__(self):
  6.         self.root = Tk()
  7.         self.frame = Frame(self.root)
  8.         self.resFrame = Frame(self.root, )
  9.         self.dataCount = StringVar()
  10.         self.gpsCount = StringVar()

  11.         self.flag = True
  12.         threading.Thread(target=self.Count).start()

  13.         self.Draw()

  14.     def Draw(self):
  15.         # 第一行,IP,端口
  16.         Label(self.frame, text='IP').grid(row=0, column=0)
  17.         self.eIP = Entry(self.frame)
  18.         self.eIP.grid(row=0, column=1)
  19.         Label(self.frame, text='Port').grid(row=0, column=2)
  20.         self.ePort = Entry(self.frame, width=5)
  21.         self.ePort.grid(row=0, column=3)
  22.         Label(self.frame, text=' ').grid(row=0, column=4)
  23.         Button(self.frame, text='Start', bd=1, width=10 ,command=self.submit).grid(row=0, column=5)

  24.         # 下面的计数器
  25.         Label(self.resFrame, text='Start time : ').grid(row=0, column=0)
  26.         Label(self.resFrame, text=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())).grid(row=0, column=1)
  27.         Label(self.resFrame, text='Elapsed Time : ').grid(row=1, column=0)
  28.         self.cLB = Label(self.resFrame, textvariable=self.dataCount)
  29.         self.cLB.grid(row=1, column=1)
  30.         Label(self.resFrame, text='Send total data : ').grid(row=2, column=0)
  31.         self.dLB = Label(self.resFrame, textvariable=self.gpsCount)
  32.         self.dLB.grid(row=2, column=1)

  33.         self.frame.pack(padx=10, pady=10)
  34.         self.resFrame.pack()

  35.         mainloop()

  36.     def Count(self):
  37.         day, h, m, s = 0, 0, 0, 0
  38.         count = 0 #测试下计数
  39.         while self.flag:
  40.             count += 1
  41.             s += 1
  42.             time.sleep(1)
  43.             if(60 == s):
  44.                 m += 1
  45.                 s = 0
  46.             elif(60 == m):
  47.                 h += 1
  48.                 m = 0
  49.             elif(24 == h):
  50.                 day += 1
  51.                 h = 0
  52.             self.dataCount.set('%02d day %02d:%02d:%02d' % (day, h, m, s))
  53.             self.gpsCount.set(count)

  54.     def __del__(self):
  55.         self.flag = False


  56.     def submit(self):
  57.         print(self.eIP.get(), self.ePort.get())



  58. g = Gui()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-8-13 09:32:22 | 显示全部楼层
新手不会,帮顶,候大神:lol::titter:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-13 09:34:28 | 显示全部楼层
笑脸对世界 发表于 2015-8-13 09:32
新手不会,帮顶,候大神

  谢谢帮顶~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-13 10:42:41 | 显示全部楼层
进来转转
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-13 18:01:16 | 显示全部楼层
尝试了几种方法,好像都是先关闭了主线程,然后子线程就木有然后了。
有一个可以退出的方法,不报错,就是用os._exit(arg),这个是直接杀进程的,不报错,副作用是缓存垃圾应该不会清理了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-14 15:47:39 | 显示全部楼层
wei_Y 发表于 2015-8-13 18:01
尝试了几种方法,好像都是先关闭了主线程,然后子线程就木有然后了。
有一个可以退出的方法,不报错,就是 ...

现在我把那个64行的self.flag = False写进了点击按钮触发的时间submit()方法里面,停止计数后再关闭界面就不会报错。

感觉右上角的“X”,tkinter应该有个关闭的事件,要是能继承下来重写就好了。在关闭前就把循环停止。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-14 16:00:31 | 显示全部楼层
猴子请来的救兵 发表于 2015-8-14 15:47
现在我把那个64行的self.flag = False写进了点击按钮触发的时间submit()方法里面,停止计数后再关闭界面 ...

嗯,翻文档时没发现这个事件,你可以细细的找找。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-17 04:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表