【问题标题】:how to create a folder according to calendar widgets pyqt5?如何根据日历小部件pyqt5创建文件夹?
【发布时间】:2021-09-06 20:11:43
【问题描述】:

我使用 pyqt5 设计器制作了这个 UI。

是否有可能在日历中选择一天(例如:22-6-2021)文件夹中的所有文件 '22-6-2021' 显示在列表中,如图所示,如果没有找到文件创建了具有某种日期格式的文件夹

【问题讨论】:

    标签: python python-3.x pyqt5 qt-designer


    【解决方案1】:

    流程是:

    • 获取在 QCalendarWidget 中选择的 QDate 并使用特定格式将其转换为字符串。
    • 使用前面的字符串,在主目录中进行搜索,如果不存在则创建目录。
    • 使用与格式匹配的目录设置为QListView的QFileSystemModel的rootIndex。
    import os
    import sys
    from pathlib import Path
    
    
    from PyQt5.QtCore import QDir
    from PyQt5.QtWidgets import (
        QApplication,
        QCalendarWidget,
        QFileSystemModel,
        QListView,
        QVBoxLayout,
        QWidget,
    )
    
    CURRENT_DIRECTORY = Path(__file__).resolve().parent
    
    
    class Widget(QWidget):
        def __init__(self, root_directory, date_format="dd-M-yyyy", parent=None):
            super().__init__(parent)
            self._root_directory = root_directory
            self._date_format = date_format
    
            self.calendar_widget = QCalendarWidget()
            self.list_view = QListView()
    
            lay = QVBoxLayout(self)
            lay.addWidget(self.calendar_widget)
            lay.addWidget(self.list_view)
    
            self.model = QFileSystemModel()
            self.model.setRootPath(os.fspath(self.root_directory))
    
            self.calendar_widget.selectionChanged.connect(self.handle_selection_changed)
    
        @property
        def root_directory(self):
            return self._root_directory
    
        @property
        def date_format(self):
            return self._date_format
    
        def handle_selection_changed(self):
            if self.list_view.model() is None:
                self.list_view.setModel(self.model)
            dt = self.calendar_widget.selectedDate()
            dt_str = dt.toString(self.date_format)
            folder = os.fspath(self.root_directory / dt_str)
            if not QDir(folder).exists():
                QDir().mkdir(folder)
            self.list_view.setRootIndex(self.model.index(folder))
    
    
    def main():
        app = QApplication(sys.argv)
        widget = Widget(CURRENT_DIRECTORY)
        widget.show()
        widget.resize(640, 480)
        widget.show()
        app.exec_()
    
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

    • 非常感谢您的回答,但是有没有办法选择日历开始的日期?例如,如果您运行您的代码并且今天是 30 则自动选择。列表中未显示任何内容,如果您尝试选择 30,则不会显示/创建任何内容,您必须选择另一个日期,然后再次选择 30 以使其工作
    • @Kok129 请看懂我的代码,不要随便复制代码,解决方法很简单:在self.calendar_widget.selectionChanged.connect(self.handle_selection_changed)之后添加self.handle_selection_changed()
    • 我确实理解了你的代码,但我还是 pyqt5 的新手,谢谢你的帮助!上帝保佑你
    【解决方案2】:

    也许我可以给你主要的想法.. 您可以为将创建文件夹的日历创建一个事件侦听器

    ....
    self.calendar.selectionChanged.connect(self.calendarListener)
    
    def checkFolders(self, date):
        directory = os.getcwd()
        ls = os.listdir(directory)
    
        for f in ls:
            if f != date:
                new_dir = os.path.join(directory, date)
                os.mkdir(new_dir)
    
    def calendarListener(self):
        qdate = self.calendar.selectedDate()
        y = qdate.year()
        m = qdate.month()
        d = qdate.day()
        date = str(d) + "-" + str(m) + "-" + str(y)
        print(date)
        self.checkFolders(date)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多