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

如果调用了另一个函数,则TkInter帧不会加载

尉迟明贤
2023-03-14
    #!/usr/bin/env python3
    import sys
    import MySQLdb

    if sys.version_info[0] == 2:
        from Tkinter import *
        import Tkinter as ttk
    else:
        from tkinter import *
        import tkinter as ttk

    class Fullscreen_Window:
        def __init__(self):
            self.tk = Tk()
            self.frame = Frame(self.tk)
            self.frame.pack()
            ttk.Button(self.tk, text="hello world").pack()

            self.tk.attributes('-zoomed', True)
            self.state = False
            self.tk.bind("<F11>", self.toggle_fullscreen)
            self.tk.bind("<Escape>", self.end_fullscreen)

            print("init running")
            self.listen_rfid() # Commenting this out makes the GUI appear, uncommenting means no GUI :(

        def toggle_fullscreen(self, event=None):
            self.state = not self.state  # Just toggling the boolean
            self.tk.attributes("-fullscreen", self.state)
            print("Toggling")
            return "break"

        def end_fullscreen(self, event=None):
            self.state = False
            self.tk.attributes("-fullscreen", False)
            return "break"

        def listen_rfid(self):
            print("Main loop running")
            dbHost = 'localhost'
            dbName = 'python'
            dbUser = 'python'
            dbPass = 'PASSWORD'

            dbConnection = MySQLdb.connect(host=dbHost, user=dbUser, passwd=dbPass, db=dbName)
            cur = dbConnection.cursor(MySQLdb.cursors.DictCursor)

            with open('/dev/stdin', 'r') as tty:
                while True:
                    RFID_input = tty.readline().rstrip()
                    cur.execute("SELECT * FROM access_list WHERE rfid_code = '%s'" % (RFID_input))

                    if cur.rowcount != 1:
                        print("ACCESS DENIED")
                    else:
                        user_info = cur.fetchone()
                        print("Welcome %s!!" % (user_info['name']))


            tty.close()
            listen_rfid()

    if __name__ == '__main__':
        w = Fullscreen_Window()
        w.tk.mainloop()

我确信这是一个非常简单的东西,但由于我是一个Python/tKinter n00b,它打败了我,我已经完成了谷歌搜索。感激地得到的任何帮助:)

共有1个答案

衡高寒
2023-03-14

Tkinter(和所有GUI)有一个称为mainloop的无限循环,它保持GUI的活动和响应。当您进行另一个无限循环(while true)时,您将阻塞tkinter的mainloop;并且GUI失败。您需要将循环放在单独的线程中,或者使用TKinter的mainloop来完成您的工作。由于您使用的是阻塞readline,所以线程是最好的方法。作为猜测,请将您的呼叫替换为以下内容:

from threading import Thread
t = Thread(target=self.listen_rfid)
t.daemon = True # this line tells the thread to quit if the GUI (master thread) quits.
t.start()

编辑:顺便说一句,你的进口非常糟糕。“ttk”是tkinter的子集,而不是别名,别名“tk”通常用于tkinter,通配符导入是不好的,应该避免。以下是tkinter导入的外观:

try:
    # python 2
    import Tkinter as tk
    import ttk
except ImportError:
    # python 3
    import tkinter as tk
    from tkinter import ttk

然后使用适当的前缀:

self.tk = tk.Tk()
self.frame = tk.Frame(self.tk)
 类似资料:
  • 问题内容: 表: 有了答案,我在这里得到了利用$ compile的这种方式 现在,当单击按钮时,我什至调用一个模态,并命令对象使用ng-model 感谢您的帮助,它运作良好。 问题答案: 编辑 :添加了用于演示 $ compile 用法的代码段 在html中,只有一个用于初始化应用程序的标签和一个用于初始化控制器的div。 在controller中,两个链接被创建为简单字符串,但分别具有两个,然后

  • 问题内容: 抱歉,我确定一个基本问题,但似乎无法弄清楚。 说我有这个程序,文件名为: 如何在另一个程序中调用它?我试过了: 而不是“ hello world”,我得到了……过去我通过将第一个文件设为类来做到这一点,但我想知道如何正确导入该函数?如果有帮助,我会在我的真实文件中打印字典 问题答案: 您需要打印调用函数的结果,而不是函数本身: 另外,您可以省略子句,而不是: 如果更方便,也可以使用:

  • 问题内容: 在我的angularJS应用程序中,我有两个模块:模块A和模块B。 如何在模块B中调用该函数? 问题答案: 您需要在 模块A中 定义一个工厂: 然后使用 模块B中* 的工厂: *

  • 我有一个活动选项卡的自动播放选项卡类current,这意味着当该选项卡活动时, 有一个名为current的类。现在我要向第一个子 添加不同的类 null null

  • 问题内容: 我有以下代码,该代码在远程服务器上安排任务,然后使用轮询完成。任务完成后,它将下载结果。我想将a返回给调用方,以便他们可以确定阻止时间和阻止时间,并为他们提供取消任务的选项。 我的问题是,如果客户端取消该方法返回的值,则块不会执行。如果我删除它。很明显,我对构图有些误解…我应该改变什么? 同样,如果我这样做: 代替 也永远不会执行。这对我来说似乎很违反直觉。从逻辑上说,返回应该不是我应

  • 问题内容: 我可以在python3.2的全局范围内调用嵌套在另一个函数内的函数吗? 这是从外部func1()调用func2()的一种方法吗? 问题答案: 否,除非您返回该函数: 甚至