鱼C论坛

 找回密码
 立即注册
楼主: 凊风

PySide6求教~

  [复制链接]
 楼主| 发表于 2024-4-4 22:04:22 | 显示全部楼层
FishC 发表于 2024-4-4 21:58
要实现程序结束后,`self.counter` 的值能够累计下来,可以将 `self.counter` 的值保存在文件中,在每 ...

算了,统计使用次数不方便。

我们能不能用Pyside6实现:

每次程序运行,读取PC时间,如果到达程序设定的时间(如2025年01月01日),就随机删除(1-100)内的代码行,然后弹出警告信息

窗来提示用户。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 22:04:40 | 显示全部楼层
凊风 发表于 2024-04-04 22:04
算了,统计使用次数不方便。

我们能不能用Pyside6 ...


当然可以!你可以使用`datetime`模块来获取当前的时间,并与设定的时间进行比较。以下是一个示例代码,演示如何在程序运行时检查时间并删除代码行:import randomfrom datetime import datetime, datefrom PySide6.QtWidgets import QApplication, QMainWindow, QMessageBoxclass MainWindow(QMainWindow):    def __init__(self):        super().__init__()        self.setWindowTitle("Code Randomizer")        self.code =         self.target_date = date(2025, 1, 1)        self.check_date()    def check_date(self):        current_date = date.today()        if current_date >= self.target_date:            self.randomize_code()            self.show_warning_dialog()    def randomize_code(self):        lines_to_delete = random.randint(1, 100)        line_indices = random.sample(range(len(self.code)), lines_to_delete)        for index in sorted(line_indices, reverse=True):            self.code.pop(index)        for line in self.code:            exec(line)    def show_warning_dialog(self):        msg_box = QMessageBox()        msg_box.setWindowTitle("警告")        msg_box.setText("程序已过期,请联系开发者更新版本!")        msg_box.setIcon(QMessageBox.Warning)        msg_box.setStandardButtons(QMessageBox.Ok)        msg_box.exec_()if __name__ == "__main__":    app = QApplication()    window = MainWindow()    app.exec()在这个示例中,我添加了一个新的方法 `check_date()` ,用于在程序运行时检查当前日期是否已经达到设定的目标日期。如果当前日期大于或等于目标日期,就会调用 `randomize_code()` 方法来随机删除代码行,并通过 `show_warning_dialog()` 方法弹出警告信息窗口。请注意,这里只是提供了一个简单的示例,你可以根据自己的需求进行适当的修改和调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 22:04:56 | 显示全部楼层
FishC 发表于 2024-4-4 22:04
当然可以!你可以使用`datetime`模块来获取当前的时间,并与设定的时间进行比较。以下是一个示例代码, ...

回复请注意Python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 22:05:19 | 显示全部楼层
凊风 发表于 2024-04-04 22:04
回复请注意Python格式


非常抱歉,以下是修正后的代码示例:import random
from datetime import datetime, date
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Code Randomizer")
        self.code = [
            # 这里是你的代码行
            # ...
        ]
        self.target_date = date(2025, 1, 1)
        self.check_date()

    def check_date(self):
        current_date = date.today()
        if current_date >= self.target_date:
            self.randomize_code()
            self.show_warning_dialog()

    def randomize_code(self):
        lines_to_delete = random.randint(1, 100)
        line_indices = random.sample(range(len(self.code)), lines_to_delete)
        for index in sorted(line_indices, reverse=True):
            self.code.pop(index)
        for line in self.code:
            exec(line)

    def show_warning_dialog(self):
        msg_box = QMessageBox()
        msg_box.setWindowTitle("警告")
        msg_box.setText("程序已过期,请联系开发者更新版本!")
        msg_box.setIcon(QMessageBox.Warning)
        msg_box.setStandardButtons(QMessageBox.Ok)
        msg_box.exec_()

if __name__ == "__main__":
    app = QApplication()
    window = MainWindow()
    app.exec()希望这次格式更符合Python的规范。如果你在代码中有其他问题或调整需求,请随时告诉我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 22:24:13 | 显示全部楼层
FishC 发表于 2024-4-4 22:05
非常抱歉,以下是修正后的代码示例:import random
from datetime import datetime, date
from PySid ...

我把到期时间设定为20240101,然后报错了:

Traceback (most recent call last):
  line 797, in login
    self.check_date()
  line 583, in check_date
    self.randomize_code()
  line 588, in randomize_code
    line_indices = random.sample(range(len(self.code)), lines_to_delete)
                                           ^^^^^^^^^
AttributeError: 'WindowA' object has no attribute 'code'. Did you mean: 'close'?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 22:24:27 | 显示全部楼层
凊风 发表于 2024-04-04 22:24
我把到期时间设定为20240101,然后报错了:

Traceb ...


非常抱歉,我在之前的代码示例中遗漏了初始化`code`属性。请尝试以下修正后的代码:
import random
from datetime import date
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Code Randomizer")
        self.code = [
            "print('Hello, World!')",
            "x = 5",
            "y = 10",
            "print(x + y)",
            # 其他行的代码...
        ]
        self.target_date = date(2024, 1, 1)
        self.check_date()

    def check_date(self):
        current_date = date.today()
        if current_date >= self.target_date:
            self.randomize_code()
            self.show_warning_dialog()

    def randomize_code(self):
        lines_to_delete = random.randint(1, 100)
        line_indices = random.sample(range(len(self.code)), lines_to_delete)
        for index in sorted(line_indices, reverse=True):
            self.code.pop(index)
        for line in self.code:
            exec(line)

    def show_warning_dialog(self):
        msg_box = QMessageBox()
        msg_box.setWindowTitle("警告")
        msg_box.setText("程序已过期,请联系开发者更新版本!")
        msg_box.setIcon(QMessageBox.Warning)
        msg_box.setStandardButtons(QMessageBox.Ok)
        msg_box.exec_()

if __name__ == "__main__":
    app = QApplication()
    window = MainWindow()
    app.exec()

在这段修正后的代码中,我们在`MainWindow`类的构造函数中添加了`self.code`属性,并初始化为包含一些示例代码的列表。这样,在调用`randomize_code()`方法时就不会出现`AttributeError: 'WindowA' object has no attribute 'code'`错误了。

请记得根据你的实际需求修改`code`属性中的代码内容。如果还有其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 22:26:43 | 显示全部楼层
FishC 发表于 2024-4-4 22:24
非常抱歉,我在之前的代码示例中遗漏了初始化`code`属性。请尝试以下修正后的代码:

不要self.code = [
            "print('Hello, World!')",
            "x = 5",
            "y = 10",
            "print(x + y)",
            # 其他行的代码...
        ]这句了吧?(因为代码行数太多,不可能全放这个中括号里啊)

现在的需求就是如果时间到期,直接随机删除几十行代码就行。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 22:27:00 | 显示全部楼层
凊风 发表于 2024-04-04 22:26
不要self.code = 这句了吧?(因为代码行数太多,不可 ...


明白了,如果只需要在时间到期时随机删除几十行代码,可以修改代码如下:import randomfrom datetime import datefrom PySide6.QtWidgets import QApplication, QMainWindow, QMessageBoxclass MainWindow(QMainWindow):    def __init__(self):        super().__init__()        self.setWindowTitle("Code Randomizer")        self.target_date = date(2024, 1, 1)        self.check_date()    def check_date(self):        current_date = date.today()        if current_date >= self.target_date:            self.randomize_code()            self.show_warning_dialog()    def randomize_code(self):        lines_to_delete = random.randint(20, 50)        with open("your_code_file.py", "r") as file:            code_lines = file.readlines()        line_indices = random.sample(range(len(code_lines)), lines_to_delete)        for index in sorted(line_indices, reverse=True):            code_lines.pop(index)        modified_code = "".join(code_lines)        with open("your_code_file.py", "w") as file:            file.write(modified_code)    def show_warning_dialog(self):        msg_box = QMessageBox()        msg_box.setWindowTitle("警告")        msg_box.setText("程序已过期,请联系开发者更新版本!")        msg_box.setIcon(QMessageBox.Warning)        msg_box.setStandardButtons(QMessageBox.Ok)        msg_box.exec_()if __name__ == "__main__":    app = QApplication()    window = MainWindow()    app.exec()在上述代码中,我们使用`with open("your_code_file.py", "r") as file`打开你的代码文件,并将文件内容读取到`code_lines`列表中。然后,通过随机抽样的方式,在`line_indices`中生成要删除的行的索引。接下来,通过`code_lines.pop(index)`逐个删除要删除的行。最后,将修改后的代码重新写回到原来的代码文件中。这样,就实现了在时间到期时随机删除几十行代码的功能。请将"your_code_file.py"替换为你的代码文件名,并根据实际需求修改删除行数的范围。希望对你有所帮助,如果还有其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 22:27:20 | 显示全部楼层
FishC 发表于 2024-4-4 22:27
明白了,如果只需要在时间到期时随机删除几十行代码,可以修改代码如下:import randomfrom datetime i ...

回复请注意Python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 22:27:34 | 显示全部楼层
凊风 发表于 2024-04-04 22:27
回复请注意Python格式


非常抱歉,下面是格式调整后的 Python 代码:
import random
from datetime import date
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Code Randomizer")
        self.target_date = date(2024, 1, 1)
        self.check_date()

    def check_date(self):
        current_date = date.today()
        if current_date >= self.target_date:
            self.randomize_code()
            self.show_warning_dialog()

    def randomize_code(self):
        lines_to_delete = random.randint(20, 50)
        with open("your_code_file.py", "r") as file:
            code_lines = file.readlines()
        line_indices = random.sample(range(len(code_lines)), lines_to_delete)
        for index in sorted(line_indices, reverse=True):
            code_lines.pop(index)
        modified_code = "".join(code_lines)
        with open("your_code_file.py", "w") as file:
            file.write(modified_code)

    def show_warning_dialog(self):
        msg_box = QMessageBox()
        msg_box.setWindowTitle("警告")
        msg_box.setText("程序已过期,请联系开发者更新版本!")
        msg_box.setIcon(QMessageBox.Warning)
        msg_box.setStandardButtons(QMessageBox.Ok)
        msg_box.exec_()

if __name__ == "__main__":
    app = QApplication()
    window = MainWindow()
    app.exec()

希望这次的回答符合您的要求。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 22:32:47 | 显示全部楼层
FishC 发表于 2024-4-4 22:27
非常抱歉,下面是格式调整后的 Python 代码:

报错:
Traceback (most recent call last):
   line 800, in login
    self.check_date()
   line 583, in check_date
    self.randomize_code()
  line 589, in randomize_code
    code_lines = file.readlines()
                 ^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 900: illegal multibyte sequence
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 22:33:00 | 显示全部楼层
凊风 发表于 2024-04-04 22:32
报错:
Traceback (most recent call last):
   lin ...


这个错误是因为在读取文件时使用了错误的编码格式。你可以尝试指定正确的编码格式来解决这个问题。在打开文件时,使用`open`函数的`encoding`参数来指定编码格式。例如,假设你的代码文件是使用UTF-8编码保存的,可以将代码修改为:import randomfrom datetime import datefrom PySide6.QtWidgets import QApplication, QMainWindow, QMessageBoxclass MainWindow(QMainWindow):    def __init__(self):        super().__init__()        self.setWindowTitle("Code Randomizer")        self.target_date = date(2024, 1, 1)        self.check_date()    def check_date(self):        current_date = date.today()        if current_date >= self.target_date:            self.randomize_code()            self.show_warning_dialog()    def randomize_code(self):        lines_to_delete = random.randint(20, 50)        with open("your_code_file.py", "r", encoding="utf-8") as file:            code_lines = file.readlines()        line_indices = random.sample(range(len(code_lines)), lines_to_delete)        for index in sorted(line_indices, reverse=True):            code_lines.pop(index)        modified_code = "".join(code_lines)        with open("your_code_file.py", "w", encoding="utf-8") as file:            file.write(modified_code)    def show_warning_dialog(self):        msg_box = QMessageBox()        msg_box.setWindowTitle("警告")        msg_box.setText("程序已过期,请联系开发者更新版本!")        msg_box.setIcon(QMessageBox.Warning)        msg_box.setStandardButtons(QMessageBox.Ok)        msg_box.exec_()if __name__ == "__main__":    app = QApplication()    window = MainWindow()    app.exec()请将`your_code_file.py`替换为你要随机化的代码文件的路径。此外,请确保你的代码文件使用UTF-8编码保存。希望这次的回答能帮到你。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 22:33:30 | 显示全部楼层
FishC 发表于 2024-4-4 22:33
这个错误是因为在读取文件时使用了错误的编码格式。你可以尝试指定正确的编码格式来解决这个问题。在打 ...

回复请注意Python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 22:33:45 | 显示全部楼层
凊风 发表于 2024-04-04 22:33
回复请注意Python格式


非常抱歉,我在回答问题时没有按照Python的代码格式进行排版。以下是经过修正后的代码:
import random
from datetime import date
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Code Randomizer")
        self.target_date = date(2024, 1, 1)
        self.check_date()

    def check_date(self):
        current_date = date.today()
        if current_date >= self.target_date:
            self.randomize_code()
            self.show_warning_dialog()

    def randomize_code(self):
        lines_to_delete = random.randint(20, 50)
        with open("your_code_file.py", "r", encoding="utf-8") as file:
            code_lines = file.readlines()
        line_indices = random.sample(range(len(code_lines)), lines_to_delete)
        for index in sorted(line_indices, reverse=True):
            code_lines.pop(index)
        modified_code = "".join(code_lines)
        with open("your_code_file.py", "w", encoding="utf-8") as file:
            file.write(modified_code)

    def show_warning_dialog(self):
        msg_box = QMessageBox()
        msg_box.setWindowTitle("警告")
        msg_box.setText("程序已过期,请联系开发者更新版本!")
        msg_box.setIcon(QMessageBox.Warning)
        msg_box.setStandardButtons(QMessageBox.Ok)
        msg_box.exec_()

if __name__ == "__main__":
    app = QApplication()
    window = MainWindow()
    app.exec()
非常抱歉给你带来任何困惑,请使用以上修正后的代码。如果你还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-5 08:02:12 | 显示全部楼层
FishC 发表于 2024-4-4 22:33
非常抱歉,我在回答问题时没有按照Python的代码格式进行排版。以下是经过修正后的代码:
非常抱歉给你 ...

with open("your_code_file.py", "w", encoding="utf-8") as file:

但这样有个问题:如果用户恶意修改了预先设定好的your_code_file.py呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-5 08:02:25 | 显示全部楼层
凊风 发表于 2024-04-05 08:02
with open("your_code_file.py", "w", encoding="utf- ...


你提出了一个很重要的问题。确实,使用`with open`操作文件时,默认情况下是可以被用户修改的。如果需要保护代码免受恶意修改,可以考虑以下几种方法:

1. **加密或编译代码**:将代码进行加密或编译,使其变得不易读取和修改。然后在运行时动态解密或反编译执行。

2. **代码签名和验证**:对代码进行数字签名,以验证代码是否被篡改。可以使用加密算法生成数字签名,并在每次运行代码时进行验证。

3. **代码检查和保护**:在代码中加入一些防篡改的机制,例如检查代码的完整性、使用哈希算法验证文件内容等。如果代码被篡改,程序可以拒绝执行或采取其他相应的措施。

请注意,以上方法都有各自的复杂性和限制,并不能完全阻止用户对代码的修改。最终取决于你对代码的保护程度和目标用户的安全需求。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-5 08:04:22 | 显示全部楼层
FishC 发表于 2024-4-5 08:02
你提出了一个很重要的问题。确实,使用`with open`操作文件时,默认情况下是可以被用户修改的。如果需 ...

代码进行加密或编译要怎么做呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-5 08:04:42 | 显示全部楼层
凊风 发表于 2024-04-05 08:04
代码进行加密或编译要怎么做呢?


对于Python代码的加密或编译,常见的做法是使用第三方工具进行处理。以下是两种常见的方法:1. **使用加密工具**:例如,可以使用像`pyminifier`这样的工具,它可以对Python代码进行压缩和混淆,使其变得不易读取和修改。你可以使用以下命令安装`pyminifier`:pip install pyminifier然后,可以使用类似以下命令对你的代码进行加密(压缩+混淆):pyminifier your_code_file.py -o encrypted_code.py请注意,加密后的代码仍然可以执行,但对于未授权的用户来说,逆向工程变得更加困难。2. **使用编译工具**:Python有几个工具可以将Python代码编译成字节码或机器码,使其更难以反向工程。其中一个常用的工具是`pyinstaller`。你可以使用以下命令安装`pyinstaller`:pip install pyinstaller然后,可以使用类似以下命令将你的代码编译成可执行程序(如果需要):pyinstaller your_code_file.py --onefile请注意,这种方法不会直接保护代码内容,但会使代码变成二进制格式,增加了对代码的保护和隐藏程度。然而,并不能完全阻止有经验的用户进行逆向工程。无论你使用哪种方法,都要记住,加密或编译只是增加了对代码的保护程度,并不能完全阻止恶意修改。最终的安全性取决于你的代码和应用的需求。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-5 09:48:31 | 显示全部楼层
FishC 发表于 2024-4-5 08:04
对于Python代码的加密或编译,常见的做法是使用第三方工具进行处理。以下是两种常见的方法:1. **使用 ...

请问pyinstaller各参数的具体意义各是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-5 09:48:50 | 显示全部楼层
凊风 发表于 2024-04-05 09:48
请问pyinstaller各参数的具体意义各是什么?


PyInstaller是一个用于将Python程序打包成独立可执行文件的工具,它提供了一些参数来进行定制化配置。下面是一些常用的参数及其意义:

- `--onefile`:将所有的依赖项和代码打包成一个单一的可执行文件,便于分发。
- `--windowed`:生成一个没有控制台窗口的可执行文件,适用于图形界面应用程序。
- `--icon=<path to icon file>`:指定应用程序的图标文件。
- `--name=<name>`:指定生成的可执行文件的名称。
- `--distpath=<path>`:指定生成的可执行文件的输出路径。
- `--specpath=<path>`:指定生成的.spec文件(构建脚本)的输出路径。
- `--clean`:在构建之前清理临时文件和输出目录。
- `--hidden-import=<module>`:手动指定需要导入但无法自动检测的模块。
- `--add-data=<src;dest or src:dest>`:将额外的数据文件(如图片、配置文件等)添加到打包文件中。

除了上述常用参数外,PyInstaller还支持更多参数用于进一步定制化的需求。你可以使用`pyinstaller --help`命令查看所有可用的参数及其详细说明。

需要注意的是,PyInstaller的参数可以通过命令行传递,也可以在一个.spec文件中进行配置。使用.spec文件可以更灵活地对打包过程进行定制,如添加hook文件、修改构建选项等。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 08:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表