import threading
class TestThread(threading.Thread):
def __init__(self, thread_num=0, timeout=1.0):
super(TestThread, self).__init__()
self.thread_num = thread_num
self.stopped = False
self.timeout = timeout
def run(self):
def target_func():
inp = raw_input("Thread %d: " % self.thread_num)
print('Thread %s input %s' % (self.thread_num, inp))
subthread = threading.Thread(target=target_func, args=())
subthread.setDaemon(True)
subthread.start()
while not self.stopped:
subthread.join(self.timeout)
print('Thread stopped')
def stop(self):
self.stopped = True
def isStopped(self):
return self.stopped
thread = TestThread()
thread.start()
import time
print('Main thread Wainting')
time.sleep(2)
thread.stop()
thread.join()
如何在tkinter窗体上动态创建组件以及销毁组件的方法。
import tkinter
import tkinter.messagebox
import tkinter.simpledialog
btnList = []
# 动态创建组件,并计算组件在窗体上的位置
def place(n):
for i in range(n):
exec('btn'+str(i)+'=tkinter.Button(root,text='+str(i)+')')
eval('btn'+str(i)).place(x=80, y=10+i*30, width=60, height=20)
btnList.append(eval('btn'+str(i)))
root.geometry('200x'+str((n)*30+70)+'+400+300')
return n*30 + 10
# 创建tkinter应用程序
root = tkinter.Tk()
# 窗口标题
root.title('动态创建组件')
# 窗口初始大小和位置
root.geometry('200x180+400+300')
# 不允许改变窗口大小
root.resizable(False, False)
# 增加按钮的按钮
def btnSetClick():
n = tkinter.simpledialog.askinteger(title='输入一个整数',
prompt='想动态增加几个按钮:',
initialvalue=3)
if n and n>0:
startY = place(n)
modify(startY)
# 根据需要禁用和启用“增加按钮”和“清空按钮”
btnSet['state'] = 'disabled'
btnClear['state'] = 'normal'
btnSet = tkinter.Button(root,
text='增加按钮',
command=btnSetClick)
def btnClearClick():
global btnList
# 删除动态创建的按钮
for btn in btnList:
btn.destroy()
btnList = []
modify(20)
btnClear['state'] = 'disabled'
btnSet['state'] = 'normal'
btnClear = tkinter.Button(root,
text='清空按钮',
command=btnClearClick)
# 默认处于禁用状态
btnClear['state'] = 'disabled'
# 动态调整“增加按钮”和“清空按钮”的位置
def modify(startY):
btnSet.place(x=10, y=startY, width=80, height=20)
btnClear.place(x=100, y=startY, width=80, height=20)
modify(20)
root.mainloop()
代码运行后初始状态为:单击“增加按钮”后,在弹出的窗口中输入5,然后窗体变为下面的样子:
单击“清空按钮“后恢复到初始状态。
类体内,所有函数外定义。所有实例对象共享。
只有通过类名调用时才能修改,通过实例调用时无法修改。
假设某类变量名为“name",如果用该类的某个实例x来为name赋值:x.name = 'xxx',实质是为该实例新定义了一个变量name。且之后无法再通过该实例调用类变量name了。因为使用实例调用某名为“xxx”变量时,若该实例没有名为“xxx”的实例变量,则会去调用名为“xxx”的类变量;若有该名称的实例变量,则该实例无法再直接调用该名称对应的类变量。因此也不推荐通过实例来调用类变量。
即:通过类实例修改类变量的值时,实际是在定义新的与类变量同名的实例变量。
类体内,某函数(一般是__ init __ ())内定义。 “self.变量名”
因为是属于某个具体实例的,因此不能通过类名访问。
如果不在__ init __ () 中调用(该函数会在创建实例时自动调用一次),则只有调用该实例中定义目标实例变量的那个函数后,才能使用目标实例变量。因此最好在__ init __ () 中定义实例变量。
类体内,某函数内定义。
直接在函数内用“变量名=值”的方式进行定义。
函数执行完毕后,该局部变量即被销毁。