python线程怎么销毁

Python09

python线程怎么销毁,第1张

可以新建一个线程作为父线程,然后实际工作是在它的一个子线程里面做,父线程循环检测一个变量来决定是否退出。Talk is cheap

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 __ () 中定义实例变量。

类体内,某函数内定义。

直接在函数内用“变量名=值”的方式进行定义。

函数执行完毕后,该局部变量即被销毁。