الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف أستطيع حفظ ملف بواسطة QfileDialog ؟

بدأه new moon في 21 فبراير 2012 · 18 رد · 1,103 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله

أنا مبتدئ في البرمجة الرسومية و واجهتني مشكلة في عمل زر للحفظ داخل محرر نصوص بسيط , و سألت في بعض المنتديات ولكن لم اجد الحل إلى الآن

فكيف أستطيع تعديل أكواد البرنامج بحيث تصبح وظيفة الزر هو حفظ النص الموجود في محرر النصوص ؟

و شكرا لكم :)

#2

إستخدم getSaveFileName

http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qfiledialog.html#getSaveFileName

1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#3

شكرا لك أخي , ولكن كيف أستطيع وضع الدالة و كيف أربطها مع الزر

لقد حاولت ان اعمل دالة للحفظ و حاولت ربطها مع الزر و لكن لم انجح ! فكيف يمكن عملها ؟

مع العلم أني صممت واجهة البرنامج بـ Qt4 Designer , و عملت كل شيء ما عدا كيفية حفظ الملفات

#4

لاتربطها مع هذه الوظيفة بل إنشئ وظيفة أخرى وقم بوضع كود حفظ الملف داخلها وقم بربطها عبر .connect

1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#5

هل يمكن أن توضح بمثال لو سمحت :)

أعتذر على إزعاجك

#6

تفضل

http://ojuba.org/wiki/docs/pyqt4#%D8%A7%D9%84%D8%B5%D9%86%D9%81_qfiledialog

سيوضح لك الفكرة

1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#7

شكرا على وقتك , سأحاول أن أطبقها

#8

للأسف لم أستطع عملها !!

#9

فضلا ضع هنا الكود الذي تستخدمه

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#10

حسنا , سأرفع مثال على ما أريد فعله وضعته في الملحقات

أتمنى ان يرشدني الأعضاء للطريقة الصحيحة لتفعيل خاصية حفظ الملف

و شكرا لكم جميعا

editor.py

#11

هذا الزر

       self.Save = QtGui.QPushButton(self.tab)

تحتاج لربطة بوظيفة للحفظ كما فعلت مع هؤلاء

        QtCore.QObject.connect(self.Delete, QtCore.SIGNAL(_fromUtf8("clicked()")), self.textBrowser.clear)
        QtCore.QObject.connect(self.Exit, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close)

فتحتاج إنشاء وظيفة وليكن doSave في الكود لديك

def doSave(self): 
...

وتضع فيها كود الحفظ وهو ان تحصل على إسم ملف الحفظ عن طريق هذه الوظيفة

http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qfiledialog.html#getSaveFileName

ثم تفتح ملف في وضع الكتابة ثم تقوم بكتابة المحتوى داخله

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#12
ahmed_youssef كتب:

هذا الزر

       self.Save = QtGui.QPushButton(self.tab)

تحتاج لربطة بوظيفة للحفظ كما فعلت مع هؤلاء

        QtCore.QObject.connect(self.Delete, QtCore.SIGNAL(_fromUtf8("clicked()")), self.textBrowser.clear)
        QtCore.QObject.connect(self.Exit, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close)

فتحتاج إنشاء وظيفة وليكن doSave في الكود لديك

def doSave(self): 
...

وتضع فيها كود الحفظ وهو ان تحصل على إسم ملف الحفظ عن طريق هذه الوظيفة

http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qfiledialog.html#getSaveFileName

ثم تفتح ملف في وضع الكتابة ثم تقوم بكتابة المحتوى داخله

أعلم ان هذا ما ينبغي علي فعله , و لكني لم أنجح من قبل

لهذا وضعت موضوعي هنا ﻷسأل عن الطريقة الصحيحة , و أنا كما قلت في بداية الموضوع مبتدئ في البرمجة الرسومية وتواجهني هذه المشكلة دائما ,فكيف أستطيع عمل الوظيفة بالشكل الصحيح ؟

هل بإمكانك تعديل الكود لي بعد إذنك ؟ و شكرا

#13

بعد إجراء بعض التعديلات لم أفلح أيضا ! و هذا هو الملف بعد التعديل : editor.py

اين الخطأ ؟ و كيف أصلحه ؟

#14

صراحة لم أستطع التعديل علي الكود الخاص بك

هنا مثال موقع أعجوبة مضاف إليه خاصية الحفظ

#!/usr/bin/python

# openfiledialog.py

import sys
import os
from PyQt4 import QtGui
from PyQt4 import QtCore


class OpenFile(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('OpenFile')

        self.textEdit = QtGui.QTextEdit()
        self.setCentralWidget(self.textEdit)
        self.statusBar()
        self.setFocus()

        exit = QtGui.QAction(QtGui.QIcon('open.png'), 'Open', self)
        exit.setShortcut('Ctrl+O')
        exit.setStatusTip('Open new File')

        save = QtGui.QAction(QtGui.QIcon('save.png'), 'Save', self)
        save.setShortcut('Ctrl+S')
        save.setStatusTip('Save File')

        self.connect(exit, QtCore.SIGNAL('triggered()'), self.showDialog)
        self.connect(save, QtCore.SIGNAL('triggered()'), self.showSaveDialog)

        menubar = self.menuBar()
        file = menubar.addMenu('&File')
        file.addAction(exit)
        file.addAction(save)

    def showDialog(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
                    '/home')
        file=open(filename)
        data = file.read()
        self.textEdit.setText(data)

    def showSaveDialog(self):
      filename = QtGui.QFileDialog.getSaveFileName(self, "Select Directory", os.path.expanduser('~'))
      file = open(filename,'w')
      file.write(self.textEdit.toPlainText())



app = QtGui.QApplication(sys.argv)
cd = OpenFile()
cd.show()
app.exec_()

وهنا مثال كامل http://www.rkblog.rk.edu.pl/w/p/simple-text-editor-pyqt4/

#15
a.atalla كتب:

صراحة لم أستطع التعديل علي الكود الخاص بك

هنا مثال موقع أعجوبة مضاف إليه خاصية الحفظ

#!/usr/bin/python

# openfiledialog.py

import sys
import os
from PyQt4 import QtGui
from PyQt4 import QtCore


class OpenFile(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('OpenFile')

        self.textEdit = QtGui.QTextEdit()
        self.setCentralWidget(self.textEdit)
        self.statusBar()
        self.setFocus()

        exit = QtGui.QAction(QtGui.QIcon('open.png'), 'Open', self)
        exit.setShortcut('Ctrl+O')
        exit.setStatusTip('Open new File')

        save = QtGui.QAction(QtGui.QIcon('save.png'), 'Save', self)
        save.setShortcut('Ctrl+S')
        save.setStatusTip('Save File')

        self.connect(exit, QtCore.SIGNAL('triggered()'), self.showDialog)
        self.connect(save, QtCore.SIGNAL('triggered()'), self.showSaveDialog)

        menubar = self.menuBar()
        file = menubar.addMenu('&File')
        file.addAction(exit)
        file.addAction(save)

    def showDialog(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
                    '/home')
        file=open(filename)
        data = file.read()
        self.textEdit.setText(data)

    def showSaveDialog(self):
      filename = QtGui.QFileDialog.getSaveFileName(self, "Select Directory", os.path.expanduser('~'))
      file = open(filename,'w')
      file.write(self.textEdit.toPlainText())



app = QtGui.QApplication(sys.argv)
cd = OpenFile()
cd.show()
app.exec_()

وهنا مثال كامل http://www.rkblog.rk.edu.pl/w/p/simple-text-editor-pyqt4/

لقد حاولت بهذه الطريقة ولم تنجح أيضا مع أنه لا يوجد أي خطأ في الكود و هذا هو ناتج محاولاتي : editor1.py

فما هو الخطا الآن ؟ و لماذا لا يريد ان يقوم بالحفظ ؟ مع أنه لا يوجد خطأ في الكود

....

#16

لماذا وضعت دالة الحفظ في Class منفصلة ؟؟؟؟؟؟؟

ولماذا أستخدمت triggered بدلا من clicked في هذا السطر

 QtCore.QObject.connect(self.Save, QtCore.SIGNAL('triggered()'), self.showSaveDialog)
#17
a.atalla كتب:

لماذا وضعت دالة الحفظ في Class منفصلة ؟؟؟؟؟؟؟

ولماذا أستخدمت triggered بدلا من clicked في هذا السطر

 QtCore.QObject.connect(self.Save, QtCore.SIGNAL('triggered()'), self.showSaveDialog)

ﻷني جربت أن أضع دالة الحفظ في الكلاس الأساسي و لكن لم أنجح فحاولت وضعها في كلاس لوحدها ربما أتمكن من تفعيل خاصية الحفظ و لكن نفس النتيجة

و أيضا جربت أن أستخدم triggered بدلا من clicked ربما تتغير النتيجة و لكن لم تفرق شيئا ,, هذا ما وصلت إليه إلى الآن و لهذا وضعت سؤالي في هذا المنتدى :)

..

#18

تفضل تعديل بسيط

# -*- coding: utf-8 -*-


import sys
import os
from PyQt4 import QtCore, QtGui


try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.tab = QtGui.QWidget()
        self.tab.setObjectName(_fromUtf8("tab"))
        self.verticalLayout = QtGui.QVBoxLayout(self.tab)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.Delete = QtGui.QPushButton(self.tab)
        self.Delete.setText(QtGui.QApplication.translate("MainWindow", "Delete", None, QtGui.QApplication.UnicodeUTF8))
        self.Delete.setObjectName(_fromUtf8("Delete"))
        self.horizontalLayout.addWidget(self.Delete)
        self.Exit = QtGui.QPushButton(self.tab)
        self.Exit.setText(QtGui.QApplication.translate("MainWindow", "Exit", None, QtGui.QApplication.UnicodeUTF8))
        self.Exit.setObjectName(_fromUtf8("Exit"))
        self.horizontalLayout.addWidget(self.Exit)
        self.Save = QtGui.QPushButton(self.tab)
        self.Save.setText(QtGui.QApplication.translate("MainWindow", "Save", None, QtGui.QApplication.UnicodeUTF8))
        self.Save.setObjectName(_fromUtf8("Save"))
        self.horizontalLayout.addWidget(self.Save)
        self.kcolorcombo = KColorCombo(self.tab)
        self.kcolorcombo.setObjectName(_fromUtf8("kcolorcombo"))
        self.horizontalLayout.addWidget(self.kcolorcombo)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.textEdit = QtGui.QTextEdit(self.tab)
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.verticalLayout.addWidget(self.textEdit)
        self.tabWidget.addTab(self.tab, _fromUtf8(""))
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName(_fromUtf8("tab_2"))
        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        QtCore.QObject.connect(self.Exit, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close)
        #QtCore.QObject.connect(self.Delete, QtCore.SIGNAL(_fromUtf8("clicked()")), self.textEdit.clear)
        QtCore.QObject.connect(self.Save, QtCore.SIGNAL("clicked()"), self.showSaveDialog)
       # QtCore.QObject.connect(self.kcolorcombo, QtCore.SIGNAL(_fromUtf8("activated(QColor)")), self.textEdit.setColor)
       # QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def showSaveDialog(self):
      filename = QtGui.QFileDialog.getSaveFileName(None, "Select Directory", os.path.expanduser('~'))
      file = open(filename,'w')
      file.write(self.textEdit.toPlainText())

    def retranslateUi(self, MainWindow):
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "Tab 1", None, QtGui.QApplication.UnicodeUTF8))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QtGui.QApplication.translate("MainWindow", "Tab 2", None, QtGui.QApplication.UnicodeUTF8))

from PyKDE4.kdeui import KColorCombo

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

ملاحظة الكود ملئ بالأخطاء فقمت بوضعها في تعليق # حتى تتحقق وظيفة الحفظ.

1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#19
ahmed_youssef كتب:

تفضل تعديل بسيط

# -*- coding: utf-8 -*-


import sys
import os
from PyQt4 import QtCore, QtGui


try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.tab = QtGui.QWidget()
        self.tab.setObjectName(_fromUtf8("tab"))
        self.verticalLayout = QtGui.QVBoxLayout(self.tab)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.Delete = QtGui.QPushButton(self.tab)
        self.Delete.setText(QtGui.QApplication.translate("MainWindow", "Delete", None, QtGui.QApplication.UnicodeUTF8))
        self.Delete.setObjectName(_fromUtf8("Delete"))
        self.horizontalLayout.addWidget(self.Delete)
        self.Exit = QtGui.QPushButton(self.tab)
        self.Exit.setText(QtGui.QApplication.translate("MainWindow", "Exit", None, QtGui.QApplication.UnicodeUTF8))
        self.Exit.setObjectName(_fromUtf8("Exit"))
        self.horizontalLayout.addWidget(self.Exit)
        self.Save = QtGui.QPushButton(self.tab)
        self.Save.setText(QtGui.QApplication.translate("MainWindow", "Save", None, QtGui.QApplication.UnicodeUTF8))
        self.Save.setObjectName(_fromUtf8("Save"))
        self.horizontalLayout.addWidget(self.Save)
        self.kcolorcombo = KColorCombo(self.tab)
        self.kcolorcombo.setObjectName(_fromUtf8("kcolorcombo"))
        self.horizontalLayout.addWidget(self.kcolorcombo)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.textEdit = QtGui.QTextEdit(self.tab)
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.verticalLayout.addWidget(self.textEdit)
        self.tabWidget.addTab(self.tab, _fromUtf8(""))
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName(_fromUtf8("tab_2"))
        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        QtCore.QObject.connect(self.Exit, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close)
        #QtCore.QObject.connect(self.Delete, QtCore.SIGNAL(_fromUtf8("clicked()")), self.textEdit.clear)
        QtCore.QObject.connect(self.Save, QtCore.SIGNAL("clicked()"), self.showSaveDialog)
       # QtCore.QObject.connect(self.kcolorcombo, QtCore.SIGNAL(_fromUtf8("activated(QColor)")), self.textEdit.setColor)
       # QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def showSaveDialog(self):
      filename = QtGui.QFileDialog.getSaveFileName(None, "Select Directory", os.path.expanduser('~'))
      file = open(filename,'w')
      file.write(self.textEdit.toPlainText())

    def retranslateUi(self, MainWindow):
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "Tab 1", None, QtGui.QApplication.UnicodeUTF8))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QtGui.QApplication.translate("MainWindow", "Tab 2", None, QtGui.QApplication.UnicodeUTF8))

from PyKDE4.kdeui import KColorCombo

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

ملاحظة الكود ملئ بالأخطاء فقمت بوضعها في تعليق # حتى تتحقق وظيفة الحفظ.

أهاا , جميل جدا .. بعد مقارنة الفرق بين الكودين يمكننا تلخيص المشكلة في التالي :

أولا الخطأ كان في جعل دالة الحفظ في كلاس منفصل

ثانيا دالة الحفظ الرئسيسة كان ينبغي تعديلها بحيث تكون هكذا

[filename = QtGui.QFileDialog.getSaveFileName(None, "Select Directory", os.path.expanduser('~'))/code]
بدلا من :
[code]filename = QtGui.QFileDialog.getSaveFileName(self, "Select Directory", os.path.expanduser('~'))

و وضع بعض الإشارات على هيئة تعليق لتتحقق وظيفة الحفظ بشكل جيد

أتمنى لو كان في تحليلي نقص أن يكمله لي الأعضاء الأفاضل لتحصل الفائدة الكاملة للجميع بإذن الله

و شكرا لجميع من تعاون معي :)

مواضيع مشابهة