首页 > 解决方案 > 这个 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'

标签: pythonpython-3.xtkinter

解决方案


这是因为您的代码意图是错误的。我建议你用类结构来组织你的程序。此外,您的无限循环会阻止 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 窗口不会冻结。


推荐阅读