鱼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循环。修改后的代码如下:
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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控件结合适当的数据源和信号槽机制。下面是一个简单的示例代码,演示如何实现三级联动选择:
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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`函数。然后在函数内部,遍历消息和颜色列表,并使用对应的颜色分别设置每一段消息的前景色。修改代码如下:
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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格式的修改后的代码:
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)

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

以上回复来自 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`函数的参数中,可以尝试以下代码:
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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格式重新编写的代码示例:
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: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-11-15 20:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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