鱼C论坛

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

Pyside6求教20240414~~~

[复制链接]
 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-14 19:35:20 | 显示全部楼层
凊风 发表于 2024-04-14 19:34
现有如下代码:
###指定目标文件夹
    def select_ ...


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

  1. def select_folder(self, select_folder):
  2.     folder_path = QFileDialog.getExistingDirectory(
  3.         self, "请指定本次查询数据即将存入的文件夹", "", QFileDialog.ShowDirsOnly)
  4.    
  5.     while True:
  6.         if folder_path:
  7.             reply = QMessageBox.question(
  8.                 self, "确认", "是否指定该文件夹作为本次查询数据即将存入的文件夹?",
  9.                 QMessageBox.Yes | QMessageBox.No)
  10.             
  11.             if reply == QMessageBox.No:
  12.                 QMessageBox.warning(self, "警告", "必须指定目标文件夹!!!")
  13.                 folder_path = QFileDialog.getExistingDirectory(
  14.                     self, "请指定本次查询数据即将存入的文件夹", "", QFileDialog.ShowDirsOnly)
  15.             else:
  16.                 file_path = os.path.join(folder_path, "行政区划代码库.xlsx")
  17.                
  18.                 if not os.path.exists(file_path):
  19.                     print('所指定路径下未发现《行政区划代码库.xlsx》!!!')
  20.                     QMessageBox.warning(self, "警告", "即将从国家统计局网站爬取最新的行政区划代码!")
  21.                     break
  22.                 else:
  23.                     update_time = os.path.getmtime(file_path)
  24.                     update_time = datetime.fromtimestamp(update_time)
  25.                     print(f'所指定路径下发现《行政区划代码库.xlsx》,更新时间为:{update_time}')
  26.                     reply = QMessageBox.question(
  27.                         self, "确认", "是否指定此《行政区划代码库.xlsx》作为本次辅助查询所使用的行政区划代码?",
  28.                         QMessageBox.Yes | QMessageBox.No)
  29.                     
  30.                     if reply == QMessageBox.Yes:
  31.                         self.Region_file = file_path
  32.                         break
  33.                     else:
  34.                         QMessageBox.warning(self, "警告", "即将从国家统计局网站爬取最新的行政区划代码!")
  35.                         folder_path = QFileDialog.getExistingDirectory(
  36.                             self, "请指定本次查询数据即将存入的文件夹", "", QFileDialog.ShowDirsOnly)
  37.         else:
  38.             break
复制代码


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

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

使用道具 举报

 楼主| 发表于 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报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-14 22:34:52 | 显示全部楼层
凊风 发表于 2024-4-14 19:38
第700行附近是:                if not os.path.exists(file_path):
                    print('所指 ...


如果有一份行政区划代码库.xlsx,请问如何用PySide6来实现省、市、县三级级联选择器?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-14 22:35:12 | 显示全部楼层
凊风 发表于 2024-04-14 22:34
如果有一份行政区划代码库.xlsx,请问如何用PySide6来 ...


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

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

  3. class MyWindow(QMainWindow):
  4.     def __init__(self):
  5.         super().__init__()
  6.         
  7.         self.setWindowTitle("三级联动选择")
  8.         
  9.         # 创建控件
  10.         self.province_combo = QComboBox()
  11.         self.city_combo = QComboBox()
  12.         self.district_combo = QComboBox()
  13.         
  14.         # 设置布局
  15.         layout = QVBoxLayout()
  16.         layout.addWidget(self.province_combo)
  17.         layout.addWidget(self.city_combo)
  18.         layout.addWidget(self.district_combo)
  19.         
  20.         widget = QWidget()
  21.         widget.setLayout(layout)
  22.         self.setCentralWidget(widget)
  23.         
  24.         # 设置数据源
  25.         self.provinces = ["省1", "省2", "省3"]
  26.         self.cities = {
  27.             "省1": ["市1", "市2"],
  28.             "省2": ["市3", "市4"],
  29.             "省3": ["市5", "市6"],
  30.         }
  31.         self.districts = {
  32.             "市1": ["区1", "区2"],
  33.             "市2": ["区3", "区4"],
  34.             "市3": ["区5", "区6"],
  35.             "市4": ["区7", "区8"],
  36.             "市5": ["区9", "区10"],
  37.             "市6": ["区11", "区12"],
  38.         }
  39.         
  40.         # 初始化数据
  41.         self.province_combo.addItems(self.provinces)
  42.         
  43.         # 连接信号槽
  44.         self.province_combo.currentIndexChanged.connect(self.update_city_combo)
  45.         self.city_combo.currentIndexChanged.connect(self.update_district_combo)
  46.    
  47.     def update_city_combo(self, index):
  48.         # 获取当前选中的省份
  49.         province = self.province_combo.currentText()
  50.         
  51.         # 根据省份获取对应的城市列表
  52.         cities = self.cities.get(province, [])
  53.         
  54.         # 更新城市下拉框
  55.         self.city_combo.clear()
  56.         self.city_combo.addItems(cities)
  57.         
  58.         # 重置区县下拉框
  59.         self.district_combo.clear()
  60.    
  61.     def update_district_combo(self, index):
  62.         # 获取当前选中的城市
  63.         city = self.city_combo.currentText()
  64.         
  65.         # 根据城市获取对应的区县列表
  66.         districts = self.districts.get(city, [])
  67.         
  68.         # 更新区县下拉框
  69.         self.district_combo.clear()
  70.         self.district_combo.addItems(districts)

  71. if __name__ == "__main__":
  72.     app = QApplication()
  73.     window = MyWindow()
  74.     window.show()
  75.     app.exec()
复制代码


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

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

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

使用道具 举报

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

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

def print_with_color又要怎么写呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-15 06:29:30 | 显示全部楼层
凊风 发表于 2024-04-15 06:29
那如果我要传入三段message、三个color,

def pri ...


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

  1. from PySide6.QtGui import QBrush, QColor

  2. # ...

  3. def print_with_color(self, messages, colors):
  4.     cursor = self.text_edit.textCursor()
  5.    
  6.     for message, color in zip(messages, colors):
  7.         format1 = self.text_edit.currentCharFormat()
  8.         brush = QBrush(QColor(color))
  9.         format1.setForeground(brush)
  10.         cursor.setCharFormat(format1)
  11.         cursor.insertText(message)
复制代码


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

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

  3. self.print_with_color(messages, colors)
复制代码


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

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

使用道具 举报

 楼主| 发表于 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):

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

使用道具 举报

发表于 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 = [message1, message2, message3]    colors = [color1, color2, color3]    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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2024-4-15 06:35:29 | 显示全部楼层
凊风 发表于 2024-04-15 06:35
回复请注意Python格式


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

  1. from PySide6.QtGui import QBrush, QColor

  2. # ...

  3. def print_with_color(self, message1, message2, message3, color1, color2, color3):
  4.     messages = [message1, message2, message3]
  5.     colors = [color1, color2, color3]
  6.     cursor = self.text_edit.textCursor()
  7.    
  8.     for message, color in zip(messages, colors):
  9.         format1 = self.text_edit.currentCharFormat()
  10.         brush = QBrush(QColor(color))
  11.         format1.setForeground(brush)
  12.         cursor.setCharFormat(format1)
  13.         cursor.insertText(message)
复制代码


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

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

使用道具 举报

 楼主| 发表于 2024-4-15 06:37:17 | 显示全部楼层
FishC 发表于 2024-4-15 06:35
非常抱歉,我忽略了代码的Python格式要求。下面是符合Python格式的修改后的代码:

这两行一定要有吗:
messages = [message1, message2, message3]
    colors = [color1, color2, color3]

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

color3)中只录入一次吗?

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

使用道具 举报

发表于 2024-4-15 06:37:29 | 显示全部楼层
凊风 发表于 2024-04-15 06:37
这两行一定要有吗:
messages =
    colors =

...


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

  1. def print_with_color(self, messages_and_colors):
  2.     cursor = self.text_edit.textCursor()
  3.     for message, color in messages_and_colors:
  4.         format1 = self.text_edit.currentCharFormat()
  5.         brush = QBrush(QColor(color))
  6.         format1.setForeground(brush)
  7.         cursor.setCharFormat(format1)
  8.         cursor.insertText(message)
复制代码


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

  1. messages_and_colors = [
  2.     ("Hello", "red"),
  3.     ("World", "green"),
  4. ]
  5. self.print_with_color(messages_and_colors)
复制代码


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

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

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

使用道具 举报

 楼主| 发表于 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)

这样的方式吗?


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

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2024-4-15 06:41:46 | 显示全部楼层
凊风 发表于 2024-04-15 06:41
回复请注意Python格式


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

  1. def print_with_color02(self, text1, variable, color1, color2):
  2.     cursor = self.plainTextEdit.textCursor()
  3.    
  4.     # 设置文本1的颜色
  5.     format1 = QTextCharFormat()
  6.     format1.setForeground(QColor(color1))
  7.     cursor.insertText(text1, format1)
  8.    
  9.     # 设置变量的颜色
  10.     format2 = QTextCharFormat()
  11.     format2.setForeground(QColor(color2))
  12.     cursor.insertText(str(variable), format2)
复制代码


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

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

使用道具 举报

 楼主| 发表于 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)

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

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 03:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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