gpt4 book ai didi

python - 如果调用另一个函数,则不会加载 TkInter Frame

转载 作者:太空狗 更新时间:2023-10-30 02:39:23 29 4
gpt4 key购买 nike

我正在编写一个 Python 程序来监听 RFID 输入,并且仅在提供有效 token 时才运行。该程序还有一个我想使用 TkInter 构建的 GUI。

拼图的两个部分单独运行都很好,但就目前而言,我似乎可以选择一个或另一个 - 但不能同时选择两个!我可以很好地绘制我的 TkInter 窗口,但是如果我调用函数开始监听 RFID 输入,那么当该位运行正常并工作时......没有 GUI。

代码如下。到目前为止,您可以通过我在终端上的打印输出看到我的调试工作...

    #!/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,所以它打败了我,我已经完成了谷歌搜索。非常感谢收到的任何帮助:)

最佳答案

Tkinter(和所有 GUI)有一个称为主循环的无限循环,它使 GUI 保持事件和响应。当你进行另一个无限循环(while True)时,你会阻塞 Tkinter 的主循环;并且 GUI 失败。您需要将循环放在单独的线程中或使用 Tkinter 的主循环来完成您的工作。由于您正在使用阻塞 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)

关于python - 如果调用另一个函数,则不会加载 TkInter Frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44658340/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com