凊风 发表于 2024-4-4 15:39:42

FishC 发表于 2024-4-4 15:38
这个错误是由于在使用`soup.find("table", class_="table table-striped table-bordered")`时,没有找 ...

能不能把此功能集合到第38#楼的代码中?

FishC 发表于 2024-4-4 15:40:00

凊风 发表于 2024-04-04 15:39
能不能把此功能集合到第38#楼的代码中?

当然可以!你可以将`crawl_data`函数的代码添加到第38楼的代码中,并在需要的地方调用该函数。以下是合并后的代码示例:import docx
from PySide6.QtWidgets import QApplication, QMainWindow, QTextEdit, QFileDialog
import requests
from bs4 import BeautifulSoup

def crawl_data(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")

    table = soup.find("table", class_="table table-striped table-bordered")
    if table:
      tbody = table.tbody
      rows = tbody.find_all("tr")

      data = []
      for row in rows:
            cells = row.find_all("td")
            row_data = []
            for cell in cells:
                row_data.append(cell.text.strip())
            data.append(row_data)

      return data
    else:
      print("未找到表格")
      return []

class MainWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("Word Reader")
      self.text_edit = QTextEdit(self)
      self.setCentralWidget(self.text_edit)
      url, _ = QFileDialog.getOpenFileName(self, "选择网页文件", "", "HTML 文件 (*.html)")
      if url:
            self.read_html_file(url)

    def read_html_file(self, url):
      data = crawl_data(url)
      for row in data:
            line = " | ".join(row)
            self.text_edit.append(line)

if __name__ == "__main__":
    app = QApplication()
    window = MainWindow()
    window.show()
    app.exec()
在此示例中,我把`crawl_data`函数添加到了代码中,并在`read_html_file`函数中调用了这个函数来获取数据,并将数据逐行显示在文本编辑器中。

注意,在代码中我使用了`getOpenFileName`来选择网页文件,你可以根据实际情况进行修改。另外,由于依赖于`requests`和`bs4`库,确保你已经安装了这两个库。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-4 21:13:37

FishC 发表于 2024-4-4 15:40
当然可以!你可以将`crawl_data`函数的代码添加到第38楼的代码中,并在需要的地方调用该函数。以下是合 ...

请问Pyside6能不能实现当使用次数到达100次时,随机删除其中的几行代码,然后出个警告提示窗?

FishC 发表于 2024-4-4 21:13:54

凊风 发表于 2024-04-04 21:13
请问Pyside6能不能实现当使用次数到达100次时,随机删 ...

是的,PySide6可以实现当使用次数到达一定数量时,随机删除代码行并弹出警告提示窗口。以下是一个示例代码:import randomfrom PySide6.QtWidgets import QApplication, QMainWindow, QMessageBoxclass MainWindow(QMainWindow):    def __init__(self):      super().__init__()      self.setWindowTitle("Code Randomizer")      self.counter = 0      self.max_uses = 100      self.code = [            "print('Hello, World!')",            "print('This is a test.')",            "print('Random code line 1')",            "print('Random code line 2')",            "print('Random code line 3')"      ]      self.show_warning = False      self.randomize_code()    def randomize_code(self):      if self.counter >= self.max_uses and not self.show_warning:            self.show_warning_dialog()            self.show_warning = True      if self.counter < self.max_uses:            self.counter += 1            # 随机删除代码行            lines_to_delete = random.randint(1, 3)            for _ in range(lines_to_delete):                if self.code:                  self.code.pop(random.randint(0, len(self.code)-1))            # 执行代码            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()在这个示例中,代码存储在一个列表中(`self.code`)。每次执行 `randomize_code` 函数时,会检查计数器(`self.counter`)是否超过最大使用次数(`self.max_uses`)。如果超过了最大使用次数且警告窗口还没有显示过,则调用 `show_warning_dialog` 函数展示警告窗口,并将 `show_warning` 设置为 `True` 以避免多次显示警告窗口。然后,随机删除1到3行代码,并通过 `exec` 函数执行剩余的代码行。请注意,使用 `exec` 函数来执行代码是有风险的,因为它可以执行任何类型的代码。请确保只运行可信任的代码,并且仅在必要时使用 `exec` 函数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-4 21:14:17

FishC 发表于 2024-4-4 21:13
是的,PySide6可以实现当使用次数到达一定数量时,随机删除代码行并弹出警告提示窗口。以下是一个示例 ...

回复请注意Python格式

FishC 发表于 2024-4-4 21:14:28

凊风 发表于 2024-04-04 21:14
回复请注意Python格式

抱歉,以下是更符合Python格式的代码示例:import random
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox

class MainWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("Code Randomizer")
      self.counter = 0
      self.max_uses = 100
      self.code = [
            # 这里是您的代码行
      ]
      self.show_warning = False
      self.randomize_code()

    def randomize_code(self):
      if self.counter >= self.max_uses and not self.show_warning:
            self.show_warning_dialog()
            self.show_warning = True
      
      if self.counter < self.max_uses:
            self.counter += 1
            
            # 随机删除代码行
            lines_to_delete = random.randint(1, 3)
            for _ in range(lines_to_delete):
                if self.code:
                  self.code.pop(random.randint(0, len(self.code)-1))

            # 执行代码
            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()

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-4 21:24:01

FishC 发表于 2024-4-4 21:14
抱歉,以下是更符合Python格式的代码示例:import random
from PySide6.QtWidgets import QApplicatio ...

self.code = [
            # 这里是您的代码行
      ]   

意思要把所有的代码全放中括号里?显然不现实啊。。。

能不能设定一个最大行数,每次要删除时从中取随机数来转换为行数来删除?

FishC 发表于 2024-4-4 21:24:16

凊风 发表于 2024-04-04 21:24
self.code =   

意思要把所有的代码全放中括号里 ...

是的,`self.code`这一行的作用是将代码存储在一个列表中,每个元素代表一行代码。你可以在其中添加需要执行的代码行。

对于删除代码行的部分,确实将所有代码放在一个列表中可能会导致不现实和混乱。为了解决这个问题,您可以设定一个最大行数,并通过从中取随机数的方式来选择要删除的行数。

以下是修改后的代码示例:

import random
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox

class MainWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("Code Randomizer")
      self.counter = 0
      self.max_uses = 100
      self.code = [
            "print('Hello, World!')",
            "x = 10",
            "y = 20",
            "result = x + y",
            "print(result)"
      ]
      self.show_warning = False
      self.randomize_code()
   
    def randomize_code(self):
      if self.counter >= self.max_uses and not self.show_warning:
            self.show_warning_dialog()
            self.show_warning = True
      
      if self.counter < self.max_uses:
            self.counter += 1
            
            # 设定要删除的行数和行数范围
            lines_to_delete = random.randint(1, min(3, len(self.code)))
            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()

此次更新后,我们将代码存储在一个列表中,然后通过生成要删除的行数和从中选择要删除的行数的行索引,以确保实际删除的行数不超过列表的长度。之后,我们根据行索引删除相应的代码行,并执行剩余的代码行。

请注意,这只是一个简单的示例,以演示如何从中删除随机行。对于复杂的代码和处理逻辑,可能需要更加详细和精确的操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-4 21:28:12

FishC 发表于 2024-4-4 21:24
是的,`self.code`这一行的作用是将代码存储在一个列表中,每个元素代表一行代码。你可以在其中添加需 ...

我的意思是:
能不能设定一个最大行数(比如说500)来代替self.code = [
            "print('Hello, World!')",
            "x = 10",
            "y = 20",
            "result = x + y",
            "print(result)"
      ],每次要删除时从(1-500)中取随机数来转换为行数来删除?

FishC 发表于 2024-4-4 21:28:33

凊风 发表于 2024-04-04 21:28
我的意思是:
能不能设定一个最大行数(比如说500) ...

非常抱歉,我之前理解有误。现在我明白了您的意思。您可以在每次操作之前生成一个行索引列表,其中包含从1到最大行数的所有行索引,然后随机选择要删除的行索引,并根据这些行索引来删除代码行。

以下是修改后的代码示例:

import random
from PySide6.QtWidgets import QApplication, QMainWindow

class MainWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("Code Randomizer")
      self.max_lines = 500
      self.code = []
      self.randomize_code()

    def randomize_code(self):
      if len(self.code) == 0:
            # 初始化代码
            for i in range(1, self.max_lines + 1):
                self.code.append(f"print('This is line {i}')")

      # 生成行索引列表
      line_indices = list(range(1, self.max_lines + 1))
      
      # 随机选择要删除的行索引
      lines_to_delete = random.randint(1, min(3, len(line_indices)))
      delete_indices = random.sample(line_indices, lines_to_delete)

      # 根据行索引删除代码行
      for index in sorted(delete_indices, reverse=True):
            self.code.pop(index-1)

      # 执行代码
      for line in self.code:
            exec(line)

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

在代码中,我们首先将代码初始化为包含从1到最大行数的打印语句。然后,我们生成一个行索引列表,并根据需要选择要删除的行索引。接下来,我们按照行索引删除代码行,并执行剩余的代码行。

请注意,这只是一个简单的示例,以演示如何从中删除随机行。对于复杂的代码和处理逻辑,可能需要更加详细和精确的操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-4 21:32:51

FishC 发表于 2024-4-4 21:28
非常抱歉,我之前理解有误。现在我明白了您的意思。您可以在每次操作之前生成一个行索引列表,其中包含 ...

self.code = []

if len(self.code) == 0:

请问这两句代码有什么作用?

FishC 发表于 2024-4-4 21:33:03

凊风 发表于 2024-04-04 21:32
self.code =

if len(self.code) == 0:

请问这 ...

非常抱歉,我之前的回答存在错误。`self.code = `这句代码应该是之前遗留在回答中的一个错误代码。实际上,在这个例子中,并不需要定义一个`self.code`变量来存储代码。

以下是修正后的代码:

import random
from PySide6.QtWidgets import QApplication, QMainWindow

class MainWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("Code Randomizer")
      self.max_lines = 500
      self.randomize_code()

    def randomize_code(self):
      for i in range(1, self.max_lines + 1):
            line = f"print('This is line {i}')"
            if random.random() >= 0.5:# 随机决定是否删除此行
                print(line)

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

在修正后的代码中,我们将要执行的代码直接在`randomize_code`方法中生成,并使用`random.random()`来随机决定是否打印每一行。

再次感谢您的指正,造成的困扰请您谅解。如还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-4 21:35:03

FishC 发表于 2024-4-4 21:33
非常抱歉,我之前的回答存在错误。`self.code = `这句代码应该是之前遗留在回答中的一个错误代码。实际 ...

这段代码中有没有随机删除代码行的功能?!!

FishC 发表于 2024-4-4 21:35:26

凊风 发表于 2024-04-04 21:35
这段代码中有没有随机代码行的功能?!!

非常抱歉,我的回答依然有误。以下是修正后的代码示例,其中包含了随机生成代码行的功能:

import random
from PySide6.QtWidgets import QApplication, QMainWindow, QTextEdit

class MainWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("Code Randomizer")
      self.text_edit = QTextEdit(self)
      self.setCentralWidget(self.text_edit)
      self.max_lines = 10# 设置要生成的代码行数
      self.randomize_code()

    def randomize_code(self):
      for i in range(1, self.max_lines + 1):
            line = f"print('This is line {i}')"
            if random.random() >= 0.5:# 随机决定是否删除此行
                self.text_edit.append(line)

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

在修正后的代码中,我们使用`QTextEdit`来显示生成的代码行。通过循环生成`self.max_lines`指定数量的代码行,并使用`random.random()`来随机决定是否将该行添加到文本编辑器中。如果随机数大于等于0.5,则添加该行;否则跳过该行。

再次感谢您的指正,我为之前的错误造成的困扰深感抱歉。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-4 21:37:09

FishC 发表于 2024-4-4 21:35
非常抱歉,我的回答依然有误。以下是修正后的代码示例,其中包含了随机生成代码行的功能:




。。我要随机删除代码行,不是增加代码行。。。。

FishC 发表于 2024-4-4 21:37:27

凊风 发表于 2024-04-04 21:37
。。我要随机删除代码行,不是增加代码行。。。。

非常抱歉,我误解了你的问题。以下是修正后的代码示例,其中包含随机删除代码行的功能:import randomfrom PySide6.QtWidgets import QApplication, QMainWindow, QTextEditclass MainWindow(QMainWindow):    def __init__(self):      super().__init__()      self.setWindowTitle("Code Randomizer")      self.text_edit = QTextEdit(self)      self.setCentralWidget(self.text_edit)      self.lines = []# 存储代码行      self.max_lines = 10# 设置要生成的代码行数      self.randomize_code()    def randomize_code(self):      for i in range(1, self.max_lines + 1):            line = f"print('This is line {i}')"            self.lines.append(line)      random.shuffle(self.lines)# 随机打乱代码行      delete_indices = random.sample(range(self.max_lines), self.max_lines // 2)# 随机选择一半的代码行进行删除      for i, line in enumerate(self.lines):            if i not in delete_indices:                self.text_edit.append(line)if __name__ == "__main__":    app = QApplication()    window = MainWindow()    window.show()    app.exec()在修正后的代码中,我们首先生成了`self.max_lines`指定数量的代码行,并存储在`self.lines`列表中。然后使用`random.shuffle()`函数对代码行进行随机打乱顺序。接下来,使用`random.sample()`函数从0到`self.max_lines-1`中随机选择一半的索引,表示要删除的代码行。最后,遍历`self.lines`列表,将不在`delete_indices`中的代码行添加到文本编辑器中进行显示。再次感谢您的指正,我为之前的错误造成的困扰深感抱歉。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-4 21:37:45

FishC 发表于 2024-4-4 21:37
非常抱歉,我误解了你的问题。以下是修正后的代码示例,其中包含随机删除代码行的功能:import randomf ...

回复请注意Python格式

FishC 发表于 2024-4-4 21:37:58

凊风 发表于 2024-04-04 21:37
回复请注意Python格式

非常抱歉,以下是修正后的代码示例,其中包含随机删除代码行的功能:

import random
from PySide6.QtWidgets import QApplication, QMainWindow, QTextEdit

class MainWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("Code Randomizer")
      self.text_edit = QTextEdit(self)
      self.setCentralWidget(self.text_edit)
      self.lines = []# 存储代码行
      self.max_lines = 10# 设置要生成的代码行数
      self.randomize_code()

    def randomize_code(self):
      for i in range(1, self.max_lines + 1):
            line = f"print('This is line {i}')"
            self.lines.append(line)
      random.shuffle(self.lines)# 随机打乱代码行
      delete_indices = random.sample(range(self.max_lines), self.max_lines // 2)# 随机选择一半的代码行进行删除
      for i, line in enumerate(self.lines):
            if i not in delete_indices:
                self.text_edit.append(line)

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

在修正后的代码中,我们首先生成了`self.max_lines`指定数量的代码行,并存储在`self.lines`列表中。然后使用`random.shuffle()`函数对代码行进行随机打乱顺序。接下来,使用`random.sample()`函数从0到`self.max_lines-1`中随机选择一半的索引,表示要删除的代码行。最后,遍历`self.lines`列表,将不在`delete_indices`中的代码行添加到文本编辑器中进行显示。

再次感谢您的指正,我为之前的错误造成的困扰深感抱歉。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-4 21:58:09

FishC 发表于 2024-4-4 21:24
是的,`self.code`这一行的作用是将代码存储在一个列表中,每个元素代表一行代码。你可以在其中添加需 ...

我发现个问题:self.counter = 0 每次退出程序后就清零了,永远达不到500次!!

要怎么实现程序结束后,self.counter 的值能够累计下来呢?

FishC 发表于 2024-4-4 21:58:24

凊风 发表于 2024-04-04 21:58
我发现个问题:self.counter = 0 每次退出程序后就清 ...

要实现程序结束后,`self.counter` 的值能够累计下来,可以将 `self.counter` 的值保存在文件中,在每次启动程序时从文件中读取并更新。以下是修改后的代码示例:

import random
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox

class MainWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("Code Randomizer")
      self.code = [
            # 在这里添加需要执行的代码行
      ]
      self.max_uses = 500
      self.load_counter()

    def load_counter(self):
      try:
            with open("counter.txt", "r") as file:
                self.counter = int(file.read())
      except FileNotFoundError:
            self.counter = 0

    def save_counter(self):
      with open("counter.txt", "w") as file:
            file.write(str(self.counter))

    def randomize_code(self):
      if self.counter >= self.max_uses:
            self.show_warning_dialog()
            return

      self.counter += 1

      # 设定要删除的行数和行数范围
      lines_to_delete = random.randint(1, min(3, len(self.code)))
      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)

      self.save_counter()

    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()

在这个示例中,我添加了两个新的方法:`load_counter()` 和 `save_counter()`。 `load_counter()` 方法用于从文件中读取 `self.counter` 的值,若文件不存在则将 `self.counter` 设置为 0。`save_counter()` 方法用于将 `self.counter` 的值保存至文件中。

在程序启动时,我调用了 `load_counter()` 来加载之前保存的 `self.counter` 值。然后在 `randomize_code()` 方法中,每次成功执行代码后将 `self.counter` 的值加一,并通过调用 `save_counter()` 方法将其保存至文件中。

这样,即使程序退出后再次启动,也能保留上次累计的 `self.counter` 值,达到累计次数的效果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: 1 2 [3] 4 5 6 7 8 9 10 11 12
查看完整版本: PySide6求教~