当前位置: 首页 > 知识库问答 >
问题:

这个tkinter程序有什么问题?[关闭]

阎慈
2023-03-14
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'

共有2个答案

许华清
2023-03-14

这是因为您的代码意图是错误的。我建议你用班级结构来组织你的课程。此外,您的无限循环会阻塞tkinter Main循环,因此即使您修复了代码,您的窗口也会冻结。下面是一个工作示例:

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窗口不会冻结。

卓麒
2023-03-14

下面是在tkinter中执行所需操作的常见方法:

import random
import time
import tkinter as tk

DELAY = 2000  # milliseconds (thousandth of a second)

def randomno():
    x = random.randint(1, 100)
    lab["text"] = x
    #time.sleep(2)  # Don't call this in a tkinter program!
    root.after(DELAY, randomno)  # Call this function again after DELAY ms.


root = tk.Tk()

lab = tk.Label(root, text="")
lab.pack()

randomno()  # Starts periodic calling of itself.
root.mainloop()

您不需要使用StringVar,只需在randomno()函数中分配新的随机值即可。

你不应该叫时间。sleep()在tkinter应用程序中。改用通用小部件方法after()。注意在上面的代码中,randomno()如何调用root。after()以安排稍后再次调用它自己。

这就是在tkinter程序中定期执行某些操作的方法,这种方法将在调用sleep()时保持GUI运行不“挂起”。

 类似资料:
  • 下面的代码返回一个错误,但我不确定原因。需要更改哪些内容以允许编译?

  • 问题内容: 我已经为Employee类的父类是抽象的并且父类中的clone()方法是抽象的编写了此克隆方法。我想用此代码复制Employee对象的原始数据类型,而不是复制每个原始数据单独键入,但是此代码在我调用clone()方法的行中有问题。(此代码在Employee类中) 错误是:来自对象类型的方法clone()不可见。 但是我的Employee类在类层次结构中,可以访问Object类中受保护的

  • 我有一个关于书库的问题...我想写一个有3个堆栈的程序,我想在每个堆栈上添加这些操作(我应该使用数组): 1.创建堆栈2。按3号。流行音乐4号。显示每个堆栈的顶部 我写的程序,但我遇到了这些错误: 错误4错误LNK2019:未解析的外部符号“public:int\u thiscall stack::IsFull2(void)”(?IsFull2@stack@@QAEHXZ)在函数“public:v

  • 我是GraphQL的新手,我正试图做一个突变来从我的数据库中删除一篇文章,但我不知道如何删除。我使用Node.js,猫鼬和GraphQL。 这是我的模式的变异。 这是我在调用API删除文章时使用的查询。 我做错了什么? 我收到一个错误的400请求。消息:“无法查询类型为“变异”的字段“删除”

  • 尝试在每周一8:15运行时间表,我尝试了以下表达式: 我想这意味着: 分钟数:15 小时:8 月日:每隔 月份:每 星期几:仅周一 年份:每 文件:http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html

  • 提示:Extra content at the end of the document这样的错误