小叶子Small_leaf

vuePress-theme-reco 小叶子Small_leaf    2022 - 2023
小叶子Small_leaf 小叶子Small_leaf
主页
分类
  • 其他
  • 随笔
  • 笔记
  • 学习
Tag
时间轴
实用工具
  • 图片格式转换 (opens new window)
  • AI抠图 (opens new window)
  • 优客API (opens new window)
  • 以图搜图

    • SauceNAO (opens new window)
    • Ascii2d (opens new window)
    • Yandex (opens new window)
关于
author-avatar

小叶子Small_leaf

28

文章

27

标签

主页
分类
  • 其他
  • 随笔
  • 笔记
  • 学习
Tag
时间轴
实用工具
  • 图片格式转换 (opens new window)
  • AI抠图 (opens new window)
  • 优客API (opens new window)
  • 以图搜图

    • SauceNAO (opens new window)
    • Ascii2d (opens new window)
    • Yandex (opens new window)
关于

frp GUI更新改进

vuePress-theme-reco 小叶子Small_leaf    2022 - 2023

frp GUI更新改进

小叶子Small_leaf 2022-09-07 frppythontkinter

# frp GUI更新改进

# 2022年9月7日

在之后我又对程序进行了一些小修小补
我想着给 frpGUI 做一个缓存功能,可以读取上一次输入的内容
这样就不用每次都从头输入那么麻烦
实现起来应该不难,于是我加了这么一段代码

if os.path.exists("frpc.ini"):  # 首先判断是否存在frpc.ini文件
    with open("frpc.ini", "r") as f:
        self.cache = (f.readlines())  # 以列表的形式获取每一行
        
    self.port.set(self.cache[9][13:])  # 去掉不需要的字符
    self.name.set(self.cache[6].strip('[]'))
    self.typ.set(self.cache[7][7:].swapcase())
    self.remote.set(self.cache[10][14:])

首次运行很成功
但是,第二次运行时显示就乱了
我一看配置文件,它的格式也乱了,多了许多空行
经过一番排查我才发现,使用readlines()获取每一行时,会在结尾带一个'\n'
那么只需要在结尾再加上一个.strip()就行

self.port.set(self.cache[9][13:].strip())
self.name.set(self.cache[6].strip('[]\n'))
self.typ.set(self.cache[7][7:].swapcase().strip())
self.remote.set(self.cache[10][14:].strip())

还修改了之前代码里一个比较蠢的地方:

def establish(self):
	if self.typ.get() == "TCP":
		typ = "tcp"
	if self.typ.get() == "UDP":
		typ = "udp"

大小写转换直接用swapcase函数就行

# 2020年10月10日

程序发给朋友测试的时候出了一点问题,似乎是程序卡住无法判断是否启动成功。怀疑是由于设备性能差异,frpc.log 文件还没生成就开始检测了。

摆在我面前的有两个解决方案,一个是继续延长sleep时间,或是换一种能更快获取日志输出的方法,也就是优化。

我选择了后者

之前使用.read()获取输出时会导致阻塞,因为它是读取全部输出,而程序并未运行完毕。

我需要一种获取实时输出的方式,于是我选择了subprocess模块,subprocess模块可以理解为os模块的升级版,可以实现os模块不能实现的功能,使用stdout.readline()就可以获得第一行的输出,那么执行三次就能获得三行的输出,fepc.exe的日志通常是三行的。我也有试图研究过能不能获取实时输出的方法,但最后还是有些问题。

最后的代码是把

def run(self):
    os.popen('frpc.exe')
    if os.path.exists("frpc.log"):
        time.sleep(1)  # 睡眠0.5秒
        with open("frpc.log", "r") as f:
            self.log = str(f.readlines()[-3:])

改成了

	self.text = ScrolledText(padding=10, height=6, autohide=True)
    self.text.pack()

...

def run(self):
    cmd = subprocess.Popen(["frpc.exe"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    time.sleep(0.1)  # 睡眠0.1秒,预防卡顿造成的意外
    self.log = cmd.stdout.readline().decode() + cmd.stdout.readline().decode() + cmd.stdout.readline().decode()  # stdout.readline()读取一行  .decode()解码
    self.text.insert(1.0, self.log)

增加了显示日志的功能