python - 这个 tkinter 程序有什么问题?
问题描述
import random
import time
from tkinter import *
root = Tk()
x = ""
lab = Label(root,text = x)
lab.pack()
root.mainloop()
def randomno():
while (1):
y = random.randint(1, 100)
y = StringVar()
x = y.get()
lab["text"] = x
#root.update_idletasks()
time.sleep(2)
randomno()
错误:
Traceback (most recent call last): File
"C:/Users/Acer/PycharmProjects/unseen/tp.py", line 26, in <module>
randomno() File "C:/Users/Acer/PycharmProjects/unseen/tp.py", line 20, in randomno
y = StringVar() File "C:\Users\Acer\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py",
line 480, in __init__
Variable.__init__(self, master, value, name) File "C:\Users\Acer\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py",
line 317, in __init__
self._root = master._root() AttributeError: 'NoneType' object has no attribute '_root'
解决方案
这是因为您的代码意图是错误的。我建议你用类结构来组织你的程序。此外,您的无限循环会阻止 tkinter 主循环,因此即使您修复了代码,您的窗口也会冻结。所以这是一个工作示例:
import random
import time
from threading import Thread
from tkinter import *
class stack_overflow():
def __init__(self, master):
self.master = master
self.x = 'trial'
self.lab = Label(self.master, text=self.x)
self.lab.pack(side="left")
self.start_radome()
def start_radome(self):
radome_thread = Thread(target=self.randomno)
radome_thread.start()
def randomno(self):
while True:
self.x = random.randint(1, 100)
self.lab.config(text='%s' % self.x)
time.sleep(1)
if __name__ == '__main__':
root = Tk()
app = stack_overflow(master=root)
root.mainloop()
所以你启动你的 tkinter,这是你的主线程。在另一个线程中启动无限循环。因此,您的 tkinter 窗口不会冻结。
推荐阅读
- python - 有没有办法使用 Python 实时检测扬声器的声音活动?
- html - 更改按钮的背景颜色以在选择时流入标题
- python - 如何定义与特定 RegExp 匹配的所有二进制字符串的列表?
- scala - 并行处理多个数据帧 Scala
- c# - C# 使用对象“别名”
- python-3.x - 如何使用 CommentedMap 对 YAML(带锚点)进行递归排序?
- php - 活动记录 CodeIgniter 2 中的这个查询有什么问题?
- javascript - Rechart Linechart 保证金问题
- mysql - MYSQL全连接4个表使用引用表
- python - Python Django 模板语言解包列表