wangliyao 发表于 2021-10-1 14:45:48

Tkinter如何使得名字滚动起来

想制作一个点名器,使得名字滚动起来,但是一运行就会未响应,停止按钮无法按下,且Label控件上的内容不会实时更新,只会在控制台显示内容


from tkinter import *
import random
import time

root = Tk()

namelist = ['一号', '二号', '三号', '四号', '五号', '六号', '七号', '八号', '九号', '十号', '十一号', '十二号']

var = StringVar()
var.set('准备抽签')

# 创建一个Label用于显示名字
textLabel = Label(root, textvariable=var, font=('微软雅黑', 30), width=10)
textLabel.grid(row=0, column=2, columnspan=2)


is_start = True

def randomname():
    global is_start
    while True:
      if is_start == False:
            break
      namerandom = random.choice(namelist)
      var.set(namerandom)
      print(namerandom)
      time.sleep(1)

def randomnamestop():
    global is_start
    is_start = False

theButton1 = Button(root, text="开始抽签", width=14, command=randomname)
theButton1.grid(row=2, column=2)
theButton2 = Button(root, text="停止", width=14, command=randomnamestop)
theButton2.grid(row=2, column=3)

mainloop()

qaoapp 发表于 2021-10-1 14:45:49

from tkinter import *
import random
import time
import threading

root = Tk()

namelist = ['一号', '二号', '三号', '四号', '五号', '六号', '七号', '八号', '九号', '十号', '十一号', '十二号']

var = StringVar()
var.set('准备抽签')

# 创建一个Label用于显示名字
textLabel = Label(root, textvariable=var, font=('微软雅黑', 30), width=10)
textLabel.grid(row=0, column=2, columnspan=2)


is_start = True

def randomname():
    global is_start
    while True:
      while is_start:
            namerandom = random.choice(namelist)
            var.set(namerandom)
            print(namerandom)
            time.sleep(1)

def randomnamestop():
    global is_start
    is_start = not is_start
    theButton2['text'] = '继续' if theButton2['text'] == '停止' else '停止'

def start_randomname_thread():
    theButton1['state'] = 'disabled'
    thread = threading.Thread(target=randomname)
    thread.daemon = True
    thread.start()

theButton1 = Button(root, text="开始抽签", width=14, command=start_randomname_thread)
theButton1.grid(row=2, column=2)
theButton2 = Button(root, text="停止", width=14, command=randomnamestop)
theButton2.grid(row=2, column=3)

mainloop()
前面的任务没执行完,停止按钮是按不了的,给点名函数开个线程试试

小伤口 发表于 2021-10-1 15:10:07

滚动的话应该涉及到动画了,试试用canvas组件吧

wangliyao 发表于 2021-10-1 15:36:28

qaoapp 发表于 2021-10-1 14:45
前面的任务没执行完,停止按钮是按不了的,给点名函数开个线程试试

完美解决,非常感谢,刚刚在另一个地方有看到另一种办法,在var.set(namerandom)后面加了一行root.update()字幕也能滚动起来

qaoapp 发表于 2021-10-1 15:47:15

wangliyao 发表于 2021-10-1 15:36
完美解决,非常感谢,刚刚在另一个地方有看到另一种办法,在var.set(namerandom)后面加了一行root.update ...

我试了一下,可能root.update()才是正常做法吧,这个模块我不是很熟悉,学习了
页: [1]
查看完整版本: Tkinter如何使得名字滚动起来