为 Tkinter 文件应用 LiveServer 逻辑

Applying LiveServer Logic for Tkinter File

熟悉VS CodeLive Server的人,应该很容易理解这道题的主要动机是什么。

但对于其他人,这里是解释:

我尝试在网络上和堆栈上进行搜索,但所有结果都是为了更新条目、标签、按钮等中的值。但我想要的是,整个 window 应该每当我更改主文件中的某些内容时都会更新,并且不应该重新打开主 window 来这样做。所以简而言之,更新整个 window 而不关闭主文件中的每个更改,或者在保存时自动重新加载程序而无需重新打开!

我尝试了什么?:

import os
main__tkinter_filename="myfile.py"
initial_filesize=os.path.getsize(main_tkinter_filename) # Getting size of the file for
                                                        # comparison.
while 1:
    final_filesize=os.path.getsize(main_tkinter_filename)
    if final_filsize<intial_filesize or final_filesize>initial_filesize:
        webbrowser.open(main_tkinter_filename)

示例:

from tkinter import *

root=Tk()
root.mainloop

产生以下 GUI:

如果我在 root=Tk() 之后添加了 a=Label(text='text')a.pack(),它应该会显示标签,如果我删除了相同的代码,它应该会删除它们。

我会尽我所能回答你的问题,

我有一些(我自己的一些项目,仍然太有限)具有 hot-reload 功能的 flutter 经验(与您上面描述的相同,你想要 python,主要是 tkinter),我最近切换到 python for gui(喜欢它!),所以我想在这里分享我的研究:

我成功地用kivy设置了hot-reload(kivymd热重载,watchdog和kaki自带,可以工作real-time) ,而对于 tkinter,虽然后者存在问题,但您必须按 Ctrl + R 才能重新加载 tkinter window,但不需要re-run python程序就可以工作,我会把link留给这里找到的资源,希望对您的查询有所帮助!

要使用 tkinter 设置 hot-reload(需要 Ctrl + R),请参考 here

要用 kivy/kivymd (real-time) 设置 hot-reload,我个人更喜欢,你可以找到官方文档 here.

提一下,我在 Manjaro (Arch linux) 上使用上面的 pycharm,atom,但我也尝试过并在 [=51] 上成功地做到了 运行 =] 10 与 vs 代码(像魅力一样工作)

希望对您有所帮助!如果您遇到任何问题,请随时询问!谢谢!

在四处挖掘之后,我终于找到了一种实现热重载功能的方法(@Stange 的回答提供了),但只是更新了选定的框架或代码。

基本思想是不断地读取文件并执行选定的代码,然后删除列表中要删除的对象。

# Live Checker.py
import keyboard
while 1:
    if keyboard.is_pressed("Ctrl+r"):
        with open('test.py','r') as file:
            file_data=file.read()
            file_data_start_index=file_data.find("'@Start@'")
            file_data_end_index=file_data.find("'@End@'")
            exec_command=file_data[file_data_start_index:file_data_end_index]
            with open('exec_log.txt','w') as txt_file:
                txt_file.write(exec_command)

这里我一直在检查是否按下了ctrl+r键,如果按下了

  • 它读取文件,
  • 将文件中的选定代码写入 txt 文件。
  • 我已分别指定@Start@@End@要更新的代码的开始和结束。
# Main.py
def check():
    with open('exec_log.txt','r') as exec_c:
        exec_command=exec_c.read()

    if len(exec_command)==0:
        pass
    else:
        print(exec_command)
        exec('for i in root.winfo_children():i.destroy()\n'+exec_command)
        print('exec')
        with open('exec_log.txt','w') as exec_c:
            pass
        root.update()
    root.after(100,check)
root.after(100,check)

并且在主文件中,我添加了上面的代码,它不断检查 exec_log.txt 文件是否有任何更改,如果有更改,则执行它们,所有这些都会破坏在remove_list.

这只是一个临时解决方案,就我而言,它帮助我在 tkinter 中实现热重载功能。