为 Tkinter 文件应用 LiveServer 逻辑
Applying LiveServer Logic for Tkinter File
熟悉VS CodeLive Server的人,应该很容易理解这道题的主要动机是什么。
但对于其他人,这里是解释:
- Live Server 的主要动机是在 Web 开发中自动重新加载您的网站! (python tkinter 发生了变化)。
- 每当我在包含 tkinter 代码的 python 文件中更改某些内容时,更改应该反映在主 window 中( 主 window 应该不会重新打开以反映更改)。
我尝试在网络上和堆栈上进行搜索,但所有结果都是为了更新条目、标签、按钮等中的值。但我想要的是,整个 window 应该每当我更改主文件中的某些内容时都会更新,并且不应该重新打开主 window 来这样做。所以简而言之,更新整个 window 而不关闭主文件中的每个更改,或者在保存时自动重新加载程序而无需重新打开!
我尝试了什么?:
- 我尝试使用
os.getsize
来检测文件的变化,这满足了我问题的第一部分,但是我无法解决第二部分,即 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 中实现热重载功能。
熟悉VS CodeLive Server的人,应该很容易理解这道题的主要动机是什么。
但对于其他人,这里是解释:
- Live Server 的主要动机是在 Web 开发中自动重新加载您的网站! (python tkinter 发生了变化)。
- 每当我在包含 tkinter 代码的 python 文件中更改某些内容时,更改应该反映在主 window 中( 主 window 应该不会重新打开以反映更改)。
我尝试在网络上和堆栈上进行搜索,但所有结果都是为了更新条目、标签、按钮等中的值。但我想要的是,整个 window 应该每当我更改主文件中的某些内容时都会更新,并且不应该重新打开主 window 来这样做。所以简而言之,更新整个 window 而不关闭主文件中的每个更改,或者在保存时自动重新加载程序而无需重新打开!
我尝试了什么?:
- 我尝试使用
os.getsize
来检测文件的变化,这满足了我问题的第一部分,但是我无法解决第二部分,即 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 中实现热重载功能。