凊风 发表于 2024-4-14 19:34:56

FishC 发表于 2024-4-14 19:01
要从用户指定的文件夹中判断是否存在名为“行政区划.xlsx”的文件,并获取其更新时间,可以使用Python ...

现有如下代码:
###指定目标文件夹
    def select_folder(self, select_folder):
      # self.textEdit_4.setPlainText('正在等待用户指定本次统计工作所有工作簿所在的目标文件夹~')
      folder_path = QFileDialog.getExistingDirectory(
            self, "请指定本次查询数据即将存入的文件夹", "", QFileDialog.ShowDirsOnly)
      if folder_path:
            reply = QMessageBox.question(
                self, "确认", "是否指定该文件夹作为本次查询数据即将存入的文件夹?",
                QMessageBox.Yes | QMessageBox.No)
            if reply == QMessageBox.No:
                QMessageBox.warning(self, "警告", "必须指定目标文件夹!!!")
                self.select_folder
            else:
                # 构造文件路径
                file_path = os.path.join(folder_path, "行政区划代码库.xlsx")
                # 判断文件是否存在
                if not os.path.exists(file_path):
                  print('所指定路径下未发现《行政区划代码库.xlsx》!!!')
                  QMessageBox.warning(self, "警告", "即将从国家统计局网站爬取最新的行政区划代码!")
                  break
                else:
                  # 获取文件的更新时间
                  update_time = os.path.getmtime(file_path)
                  update_time = datetime.fromtimestamp(update_time)
                  print(f'所指定路径下发现《行政区划代码库.xlsx》,更新时间为:{update_time}')
                  reply = QMessageBox.question(
                        self, "确认", "是否指定此《行政区划代码库.xlsx》作为本次辅助查询所使用的行政区划代码?",
                        QMessageBox.Yes | QMessageBox.No)
                  if reply == QMessageBox.Yes:
                        self.Region_file = file_path
                        break
                  else:
                        QMessageBox.warning(self, "警告", "即将从国家统计局网站爬取最新的行政区划代码!")

请问为什么会报错啊:
line 700
    break
    ^^^^^
SyntaxError: 'break' outside loop

FishC 发表于 2024-4-14 19:35:20

凊风 发表于 2024-04-14 19:34
现有如下代码:
###指定目标文件夹
    def select_ ...

你好!这个错误是因为`break`语句只能在循环结构中使用,而你的代码中的`break`语句位于if语句的内部。解决这个问题的方法是将if语句放入一个循环结构中,例如使用while循环。修改后的代码如下:

def select_folder(self, select_folder):
    folder_path = QFileDialog.getExistingDirectory(
      self, "请指定本次查询数据即将存入的文件夹", "", QFileDialog.ShowDirsOnly)
   
    while True:
      if folder_path:
            reply = QMessageBox.question(
                self, "确认", "是否指定该文件夹作为本次查询数据即将存入的文件夹?",
                QMessageBox.Yes | QMessageBox.No)
            
            if reply == QMessageBox.No:
                QMessageBox.warning(self, "警告", "必须指定目标文件夹!!!")
                folder_path = QFileDialog.getExistingDirectory(
                  self, "请指定本次查询数据即将存入的文件夹", "", QFileDialog.ShowDirsOnly)
            else:
                file_path = os.path.join(folder_path, "行政区划代码库.xlsx")
               
                if not os.path.exists(file_path):
                  print('所指定路径下未发现《行政区划代码库.xlsx》!!!')
                  QMessageBox.warning(self, "警告", "即将从国家统计局网站爬取最新的行政区划代码!")
                  break
                else:
                  update_time = os.path.getmtime(file_path)
                  update_time = datetime.fromtimestamp(update_time)
                  print(f'所指定路径下发现《行政区划代码库.xlsx》,更新时间为:{update_time}')
                  reply = QMessageBox.question(
                        self, "确认", "是否指定此《行政区划代码库.xlsx》作为本次辅助查询所使用的行政区划代码?",
                        QMessageBox.Yes | QMessageBox.No)
                  
                  if reply == QMessageBox.Yes:
                        self.Region_file = file_path
                        break
                  else:
                        QMessageBox.warning(self, "警告", "即将从国家统计局网站爬取最新的行政区划代码!")
                        folder_path = QFileDialog.getExistingDirectory(
                            self, "请指定本次查询数据即将存入的文件夹", "", QFileDialog.ShowDirsOnly)
      else:
            break

在上述代码中,我将整个逻辑放入一个无限循环中,并根据用户的回答来决定如何继续执行。如果用户不指定文件夹或者选择了取消按钮,则会跳出循环。希望这能帮助到你!如果还有其他问题,请随时提问。

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

凊风 发表于 2024-4-14 19:38:39

凊风 发表于 2024-4-14 19:34
现有如下代码:
###指定目标文件夹
    def select_folder(self, select_folder):


第700行附近是:                if not os.path.exists(file_path):
                  print('所指定路径下未发现《行政区划代码库.xlsx》!!!')
                  QMessageBox.warning(self, "警告", "即将从国家统计局网站爬取最新的行政区划代码!")
                  break
这个break报错

FishC 发表于 2024-4-14 19:38:54

凊风 发表于 2024-04-14 19:38
第700行附近是:                if not os.path.exis ...

非常抱歉,我的回答有误。在这种情况下,使用`break`语句是不正确的,因为它试图退出当前的循环结构,但实际上没有在循环中。如果你想停止执行后续的代码,可以使用`return`语句来从函数中返回。修改代码如下:if not os.path.exists(file_path):    print('所指定路径下未发现《行政区划代码库.xlsx》!!!')    QMessageBox.warning(self, "警告", "即将从国家统计局网站爬取最新的行政区划代码!")    return现在,当文件不存在时,代码会打印提示信息并弹出警告对话框,然后直接从函数中返回,而不会引发错误。

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

凊风 发表于 2024-4-14 22:34:52

凊风 发表于 2024-4-14 19:38
第700行附近是:                if not os.path.exists(file_path):
                  print('所指 ...

如果有一份行政区划代码库.xlsx,请问如何用PySide6来实现省、市、县三级级联选择器?

FishC 发表于 2024-4-14 22:35:12

凊风 发表于 2024-04-14 22:34
如果有一份行政区划代码库.xlsx,请问如何用PySide6来 ...

要实现省市县的三级联动选择,你可以使用PySide6中的QComboBox控件结合适当的数据源和信号槽机制。下面是一个简单的示例代码,演示如何实现三级联动选择:

from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QComboBox
from PySide6.QtCore import Qt

class MyWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      
      self.setWindowTitle("三级联动选择")
      
      # 创建控件
      self.province_combo = QComboBox()
      self.city_combo = QComboBox()
      self.district_combo = QComboBox()
      
      # 设置布局
      layout = QVBoxLayout()
      layout.addWidget(self.province_combo)
      layout.addWidget(self.city_combo)
      layout.addWidget(self.district_combo)
      
      widget = QWidget()
      widget.setLayout(layout)
      self.setCentralWidget(widget)
      
      # 设置数据源
      self.provinces = ["省1", "省2", "省3"]
      self.cities = {
            "省1": ["市1", "市2"],
            "省2": ["市3", "市4"],
            "省3": ["市5", "市6"],
      }
      self.districts = {
            "市1": ["区1", "区2"],
            "市2": ["区3", "区4"],
            "市3": ["区5", "区6"],
            "市4": ["区7", "区8"],
            "市5": ["区9", "区10"],
            "市6": ["区11", "区12"],
      }
      
      # 初始化数据
      self.province_combo.addItems(self.provinces)
      
      # 连接信号槽
      self.province_combo.currentIndexChanged.connect(self.update_city_combo)
      self.city_combo.currentIndexChanged.connect(self.update_district_combo)
   
    def update_city_combo(self, index):
      # 获取当前选中的省份
      province = self.province_combo.currentText()
      
      # 根据省份获取对应的城市列表
      cities = self.cities.get(province, [])
      
      # 更新城市下拉框
      self.city_combo.clear()
      self.city_combo.addItems(cities)
      
      # 重置区县下拉框
      self.district_combo.clear()
   
    def update_district_combo(self, index):
      # 获取当前选中的城市
      city = self.city_combo.currentText()
      
      # 根据城市获取对应的区县列表
      districts = self.districts.get(city, [])
      
      # 更新区县下拉框
      self.district_combo.clear()
      self.district_combo.addItems(districts)

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

在这个示例中,我们创建了三个QComboBox控件用于显示省、市、县的选择。然后设置了相应的数据源,包括省份列表、城市字典和区县字典。在控件初始化时,我们将省份列表添加到`self.province_combo`中,并连接了`currentIndexChanged`信号与对应的槽函数。在槽函数中,根据当前选中的省份更新城市下拉框,并根据当前选中的城市更新区县下拉框。

你可以根据自己的实际需求调整数据源和显示效果。

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

凊风 发表于 2024-4-15 06:29:20

FishC 发表于 2024-4-14 17:08
这个错误是因为`setForeground()`方法需要接受一个`QBrush`对象作为参数,而不是直接传入颜色字符串。 ...

那如果我要传入三段message、三个color,

def print_with_color又要怎么写呢?

FishC 发表于 2024-4-15 06:29:30

凊风 发表于 2024-04-15 06:29
那如果我要传入三段message、三个color,

def pri ...

如果你要传入三段message和三个color,可以将它们作为列表或元组的形式传递给`print_with_color`函数。然后在函数内部,遍历消息和颜色列表,并使用对应的颜色分别设置每一段消息的前景色。修改代码如下:

from PySide6.QtGui import QBrush, QColor

# ...

def print_with_color(self, messages, colors):
    cursor = self.text_edit.textCursor()
   
    for message, color in zip(messages, colors):
      format1 = self.text_edit.currentCharFormat()
      brush = QBrush(QColor(color))
      format1.setForeground(brush)
      cursor.setCharFormat(format1)
      cursor.insertText(message)

在`print_with_color`函数中,我们使用了`zip`函数来同时迭代`messages`和`colors`列表,并根据当前的消息和颜色设置`format1`和`cursor`对象。然后,我们使用`cursor.insertText`方法插入消息文本。使用方式如下:

messages = ["Hello", "World", "!"]
colors = ["red", "green", "blue"]

self.print_with_color(messages, colors)

这样,你就可以通过传入多段消息和对应的颜色来调用`print_with_color`函数了。希望能对你有所帮助!

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

凊风 发表于 2024-4-15 06:34:43

FishC 发表于 2024-4-15 06:29
如果你要传入三段message和三个color,可以将它们作为列表或元组的形式传递给`print_with_color`函数。 ...

这个看起不太方便啊,能不能直接写成

def print_with_color(self, messages1,messages2, messages3, messages4,colors1,colors2,colors3,

colors4):

这样的形式啊?

FishC 发表于 2024-4-15 06:34:54

凊风 发表于 2024-04-15 06:34
这个看起不太方便啊,能不能直接写成

def print_wi ...

当然可以!你可以将消息和颜色作为分别的参数传递给`print_with_color`函数。修改的代码如下:from PySide6.QtGui import QBrush, QColor# ...def print_with_color(self, message1, message2, message3, color1, color2, color3):    messages =     colors =     cursor = self.text_edit.textCursor()      for message, color in zip(messages, colors):      format1 = self.text_edit.currentCharFormat()      brush = QBrush(QColor(color))      format1.setForeground(brush)      cursor.setCharFormat(format1)      cursor.insertText(message)在这个修改后的代码中,我们将`messages1, messages2, messages3`作为三段消息的参数,`color1, color2, color3`作为三个颜色的参数。然后,我们将这些参数放入列表`messages`和`colors`中。接下来的逻辑与之前相同。使用方式如下:self.print_with_color("Hello", "World", "FishC", "red", "green", "blue")通过这种方式,你可以更方便地传入多段消息和对应的颜色。希望对你有所帮助!

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

凊风 发表于 2024-4-15 06:35:24

FishC 发表于 2024-4-15 06:34
当然可以!你可以将消息和颜色作为分别的参数传递给`print_with_color`函数。修改的代码如下:from PyS ...

回复请注意Python格式

FishC 发表于 2024-4-15 06:35:29

凊风 发表于 2024-04-15 06:35
回复请注意Python格式

非常抱歉,我忽略了代码的Python格式要求。下面是符合Python格式的修改后的代码:

from PySide6.QtGui import QBrush, QColor

# ...

def print_with_color(self, message1, message2, message3, color1, color2, color3):
    messages =
    colors =
    cursor = self.text_edit.textCursor()
   
    for message, color in zip(messages, colors):
      format1 = self.text_edit.currentCharFormat()
      brush = QBrush(QColor(color))
      format1.setForeground(brush)
      cursor.setCharFormat(format1)
      cursor.insertText(message)

通过这种方式,你可以更方便地传入多段消息和对应的颜色。希望对你有所帮助!

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

凊风 发表于 2024-4-15 06:37:17

FishC 发表于 2024-4-15 06:35
非常抱歉,我忽略了代码的Python格式要求。下面是符合Python格式的修改后的代码:




这两行一定要有吗:
messages =
    colors =

不能合并到def print_with_color(self, message1, message2, message3, color1, color2,

color3)中只录入一次吗?

FishC 发表于 2024-4-15 06:37:29

凊风 发表于 2024-04-15 06:37
这两行一定要有吗:
messages =
    colors =

...

非常抱歉,我在前面的回答中出现了错误。我应该没有完全理解你的问题。如果你希望将`messages`和`colors`合并到`print_with_color`函数的参数中,可以尝试以下代码:

def print_with_color(self, messages_and_colors):
    cursor = self.text_edit.textCursor()
    for message, color in messages_and_colors:
      format1 = self.text_edit.currentCharFormat()
      brush = QBrush(QColor(color))
      format1.setForeground(brush)
      cursor.setCharFormat(format1)
      cursor.insertText(message)

然后,你可以将多条消息和颜色作为元组的列表传递给`print_with_color`函数。例如:

messages_and_colors = [
    ("Hello", "red"),
    ("World", "green"),
]
self.print_with_color(messages_and_colors)

这样做的好处是,你可以根据需要传递任意数量的消息和颜色组合。

对于这个特定的问题,我犯了一个错误,并且导致了一些混乱。非常抱歉给你带来困扰,希望这次的回答能够解决你的问题。

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

凊风 发表于 2024-4-15 06:40:44

FishC 发表于 2024-4-15 06:37
非常抱歉,我在前面的回答中出现了错误。我应该没有完全理解你的问题。如果你希望将`messages`和`color ...

不能写成    def print_with_color02(self, text1, variable, color1, color2):
      cursor = self.plainTextEdit.textCursor()

      # 设置文本1的颜色
      format1 = QTextCharFormat()
      format1.setForeground(QColor(color1))
      cursor.insertText(text1, format1)

      # 设置变量1的颜色
      format2 = QTextCharFormat()
      format2.setForeground(QColor(color2))
      cursor.insertText(str(variable), format2)

这样的方式吗?


FishC 发表于 2024-4-15 06:40:55

凊风 发表于 2024-04-15 06:40
不能写成    def print_with_color02(self, text1, va ...

是的,你的代码可以按照你的方式进行编写。将`print_with_color02`函数的参数修改为`text1, variable, color1, color2`是可以的。然后,根据传入的颜色参数设置文本和变量的颜色。最后,使用`insertText`方法将文本和变量插入到文本编辑器中。以下是修改后的代码:def print_with_color02(self, text1, variable, color1, color2):    cursor = self.plainTextEdit.textCursor()    # 设置文本1的颜色    format1 = QTextCharFormat()    format1.setForeground(QColor(color1))    cursor.insertText(text1, format1)    # 设置变量的颜色    format2 = QTextCharFormat()    format2.setForeground(QColor(color2))    cursor.insertText(str(variable), format2)使用这种方式,你可以传递文本、变量和颜色作为参数,并将它们插入到文本编辑器中,并且可以根据需要重复调用该函数。希望这次回答能够解决你的问题,如果还有其他问题,请随时提问。

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

凊风 发表于 2024-4-15 06:41:34

FishC 发表于 2024-4-15 06:40
是的,你的代码可以按照你的方式进行编写。将`print_with_color02`函数的参数修改为`text1, variable,...

回复请注意Python格式

FishC 发表于 2024-4-15 06:41:46

凊风 发表于 2024-04-15 06:41
回复请注意Python格式

非常抱歉,我在上一条回答中没有保持好Python代码的格式。以下是使用正确的Python格式重新编写的代码示例:

def print_with_color02(self, text1, variable, color1, color2):
    cursor = self.plainTextEdit.textCursor()
   
    # 设置文本1的颜色
    format1 = QTextCharFormat()
    format1.setForeground(QColor(color1))
    cursor.insertText(text1, format1)
   
    # 设置变量的颜色
    format2 = QTextCharFormat()
    format2.setForeground(QColor(color2))
    cursor.insertText(str(variable), format2)

非常抱歉给你带来困扰,感谢你的指正。如果还有其他问题,请随时提问。

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

凊风 发表于 2024-4-15 06:43:51

FishC 发表于 2024-4-14 17:08
这个错误是因为`setForeground()`方法需要接受一个`QBrush`对象作为参数,而不是直接传入颜色字符串。 ...

那请问这一段回复,和之前你教我的 def print_with_color02(self, text1, variable, color1, color2):
      cursor = self.plainTextEdit.textCursor()

      # 设置文本1的颜色
      format1 = QTextCharFormat()
      format1.setForeground(QColor(color1))
      cursor.insertText(text1, format1)

      # 设置变量1的颜色
      format2 = QTextCharFormat()
      format2.setForeground(QColor(color2))
      cursor.insertText(str(variable), format2)

有什么区别呢?   

FishC 发表于 2024-4-15 06:44:03

凊风 发表于 2024-04-15 06:43
那请问这一段回复,和之前你教我的 def print_with_co ...

这段代码和之前的代码是有区别的。主要区别在于使用了不同的文本编辑控件和字符格式对象。

在之前的回答中,我们假设你使用的是`QTextEdit`控件,并且通过`currentCharFormat()`方法获取当前光标所在位置的字符格式。然后,我们创建一个`QBrush`对象来设置前景色,并将其传递给`setForeground()`方法。

而在新的代码中,你使用的是`plainTextEdit`作为文本编辑控件,该控件采用了不同的API。在这个代码中,我们直接使用`QTextCharFormat`来创建字符格式对象,并使用`setForeground()`方法来设置颜色。

所以,在这两段代码中,主要区别在于使用的文本编辑控件和创建字符格式对象的方式。根据你的实际情况,选择适合你的代码即可。

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