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

ما هي الطريقة الصحيحة لاستخدام QFileDialog

بدأه اسلام مصطفي في 13 أغسطس 2011 · 16 رد · 1,407 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم،

احاول استخدام QFileDialog و لكن لا اعلم ما هي الطريقة الصحيحة للحصول علي مسار الملف الذي تم اختياره و نسخ محتواه الي QTextEdit (البرنامج عبارة عن Note Pad)

جربت هذا الكود (واضح انه غلط):

def openDialogFunc(self):
        self.openDialog = QFileDialog()
        fileName  = self.openDialog.getOpenFileName()
        file = open(str(fileName), 'r+')
        fileContents = read(file)
        txtarea = textArea()
        txtarea.setText(str(fileContents))

و حصلت علي هذا الخطأ

TypeError: coercing to Unicode: need string or buffer, tuple found

لذا ما هو الخطأ بهذا الكود او الدالة اليت احتاجها لفتح الملف قراءة ما بداخله، و ما الطريقة لعمل save و save as ، لان ال Dialog بكل مرة يستخدك كلمة open.

صورة البرنامج

Selection_001.png

شكرا مقدماً

#2

print ("tip 1")

print ("use those []")

print ("tip 2")

print (fileName)

1

other ESTJ thing

اقتباس
Help Me To Help You

0xBAD00DAD.png

#3
ihope كتب:

print ("tip 1")

print ("use those []")

print ("tip 2")

print (fileName)

لم افهم قصدك اخي و لكن هذا ناتج طباعة fileName

(u'/home/mach****/arabteam', u'')
#4

ضع المسار مباشرة fileName في الدالة open بدون التحويل ل str

لاحظ ان المشكلة هي محاولة فتح مسار ملف (على هيئة tuple!!!) ودا مستحيل على open

(map share people)

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

#5
ahmed_youssef كتب:

ضع المسار مباشرة fileName في الدالة open بدون التحويل ل str

لاحظ ان المشكلة هي محاولة فتح مسار ملف (على هيئة tuple!!!) ودا مستحيل على open

فعلا هو دا الخطأ اللي بيظهرلي، انا str حطتها للتجربة لكن جربت من غيرها طلعتلي مشكلة ال Tuple

انا دخلت علي اعجوبة و لقيت شرح عن الدالة و استخدمت نفس الكود اللي مكتوب في الشرح

    def openDialogFunc(self):
        fileName = QFileDialog().getOpenFileName(self,'Open File','/home')
        file = open(fileName)
        data = file.read()
        self.textArea.setText(str(data))

TypeError: coercing to Unicode: need string or buffer, tuple found

لماذا يكون الناتج Tuple لل fileName ؟؟

بعد استخدام

fileName[0]

نجحت في طبع البيانات print data، لكنها لا تظهر في ال textArea سأجرب مرة اخري،.

اعتقد ان هذا ما قصده ihope ، و لكن اول مرة اتعامل مع Tuple و لم اعلم انه يمكن استدعاء بيانات من داخلها مثل المصفوفة.

تم تعديل هذه المشاركة بواسطة اسلام مصطفي في 13 أغسطس 2011 في 09:40

1
#6

أنظر الكود التالي

#!/usr/bin/python
# -*- coding: utf-8 -*-

# openfiledialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class Example(QtGui.QMainWindow):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):

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

        openFile = QtGui.QAction(QtGui.QIcon('open.png'), 'Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open new File')
        self.connect(openFile, QtCore.SIGNAL('triggered()'), self.showDialog)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(openFile)

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

    def showDialog(self):

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

app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_()

الدالة open بتفتح الناتج من getOpenFileName

ياريت تضع الكود كله لأجربه

(map share people)

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

#7

حسنا ها هي ملفات البرنامج كاملة، كود ال QFileDialog موجود بملف toolbar.py

ما توصلت اليه حتي الأن هو

1- فتح ملفات و لكن لا استطيع ان اجعل ما بداخلها يظهر في ال QTextEdit

2- انشاء ملفات جديدة، و لكن تظهر فارغة

Textile.tar.gz

#8

سوري هي غلطتي أنت بتستخدم PySide

فالعائد هو ال fileName, filter

static PySide.QtGui.QFileDialog.getOpenFileName([parent=None[, caption=""[, dir=""[, filter=""[, selectedFilter=""[, options=0]]]]]])
    Parameters:	

        parent – PySide.QtGui.QWidget
        caption – unicode
        dir – unicode
        filter – unicode
        selectedFilter – unicode
        options – PySide.QtGui.QFileDialog.Options

    Return type:	

    (fileName, selectedFilter)

فخذ ال fileName من العنصر الأول في ال tuple

(map share people)

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

#9
ahmed_youssef كتب:

سوري هي غلطتي أنت بتستخدم PySide

فالعائد هو ال fileName, filter

static PySide.QtGui.QFileDialog.getOpenFileName([parent=None[, caption=""[, dir=""[, filter=""[, selectedFilter=""[, options=0]]]]]])
    Parameters:	

        parent – PySide.QtGui.QWidget
        caption – unicode
        dir – unicode
        filter – unicode
        selectedFilter – unicode
        options – PySide.QtGui.QFileDialog.Options

    Return type:	

    (fileName, selectedFilter)

فخذ ال fileName من العنصر الأول في ال tuple

هذا بالفعل ما فعلته

fileName[0]

لكن الغريب ان محتوي الملف لا يظهر علي ال QTextEdit و عند انشاء ملف جديد و حفظه يكون فاضي

#10

بالتأكيد لكونك تتعامل مع ناتج textArea وهو ويدجت TextArea فارغة!! فكل مرة تستدعيها تنشئ كائن جديد من نوع textArea!!!

2
(map share people)

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

#11
ahmed_youssef كتب:

بالتأكيد لكونك تتعامل مع ناتج textArea وهو ويدجت TextArea فارغة!! فكل مرة تستدعيها تنشئ كائن جديد من نوع textArea!!!

ههههههه بعد تأمل كبير فهمتك، ال textArea اللي ظاهر هو كائن استدعيته في ملف Notz.py و دا كائن تاني غير textArea اللي كنت بحاول اعمله setText في ملف Toolbar

الحل : استدعاء الكائن textArea في ملف toolbar، و عند الحاجة اليها في ملف اخر نستخدم الكائن الذي تم استعداء في ملف toolbar

الأن في بالي سؤالين :

1- بعد فتح ملف و التعديل عليه و الضغط علي save، ستظهر لي نافذة الحفظ و لكن الطبيعي ان يتم حفظ الملف تلقائيا دون الحاجة لفتح نافذة و اختياره و عمل Replace للملف القديم، فما هي الطريقة الصحيحة لذلك ؟ جربت طريقة ان يكون هناك متغير يحمل قيمة ياما صفر او واحد، و لكن لم تنجح.

2- عند فتح ملف يحتي علي لغة عربية ، فلا تظهر بشكل سليم، هل هناك طريقة لاصلاحها مثلا ك encoding، اعتقد يجب ضبطه الي utf-8

#12

قم بعمل إختيارين

إختيار save وإختيار save as :)

(map share people)

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

#13
اسلام مصطفي كتب:

1- بعد فتح ملف و التعديل عليه و الضغط علي save، ستظهر لي نافذة الحفظ و لكن الطبيعي ان يتم حفظ الملف تلقائيا دون الحاجة لفتح نافذة و اختياره و عمل Replace للملف القديم، فما هي الطريقة الصحيحة لذلك ؟ جربت طريقة ان يكون هناك متغير يحمل قيمة ياما صفر او واحد، و لكن لم تنجح.

السلام عليكم

[*] اعمل للتطبيق متغير عام او خاصية لو كان التطبيق فئة وليكن اسمه

currentFile  = None

[*] بعد ما تقتح الملف في دالة فتح الملف خليها (الدالة) تسند اسم الملف

currentFile  = fileName

[*] ودالة الـ save تتاكد ان الـ currentFile مش None

لو None يبقي نستخدم QFileDialog

ولو ليه قيمة (currentFile ) يبقى نحفظ فيه المحتوى

تحياتي

1

other ESTJ thing

اقتباس
Help Me To Help You

0xBAD00DAD.png

#14
ihope كتب:

السلام عليكم

[*] اعمل للتطبيق متغير عام او خاصية لو كان التطبيق فئة وليكن اسمه

currentFile  = None

[*] بعد ما تقتح الملف في دالة فتح الملف خليها (الدالة) تسند اسم الملف

currentFile  = fileName

[*] ودالة الـ save تتاكد ان الـ currentFile مش None

لو None يبقي نستخدم QFileDialog

ولو ليه قيمة (currentFile ) يبقى نحفظ فيه المحتوى

تحياتي

انا عملتها بطريقة مختلفة شوية، و هي ان زر Save يكون Disabled و عندما يتم فتح ملف يكون enabled . و ايضا استخدمت المتغير لمعرفة اذا كان الملف مفتوح ام لا.

و حتي الأن لم اجد حل لمشكلة اللغة العربية عند فتح الملفات، و يبدو اني اواجه مشكلة مع setAlignment لأزار ال ( Justify )

استخدمت هذا و لكن بها مشكلة

self.connect(self.setBold, SIGNAL('clicked()'), self.textArea, SLOT('setFontWeight(1)'))
        self.connect(self.setUnderline, SIGNAL('clicked()'), self.textArea, SLOT('setFontUnderline(True)'))
        self.connect(self.setItalic, SIGNAL('clicked()'), self.textArea, SLOT('setFontItalic()'))
        self.connect(self.justifyLeft, SIGNAL('clicked()'), self.textArea, SLOT("setAlignment('left')"))
        self.connect(self.justifyCenter, SIGNAL('clicked()'), self.textArea, SLOT("setAlignment('center')"))
        self.connect(self.justifyRight, SIGNAL('clicked()'), self.textArea, SLOT("setAlignment('right')"))
#15

اولا موضوع الترميز encoding استخدم موديول chardet لايجاد ترميز الملف

easy_install chardet

>>> import chardet
>>> chardet.detect(urlread("http://google.cn/"))
{'encoding': 'GB2312', 'confidence': 0.99}

وانظر مثال

pyside-pyside-examples\examples\tools\codecs

ان لم يكن لديك امثلة pyside

pyside-pyside-examples-master.tar.gz

تحياتي

تم تعديل هذه المشاركة بواسطة ihope في 15 أغسطس 2011 في 22:32

1

other ESTJ thing

اقتباس
Help Me To Help You

0xBAD00DAD.png

#16
اسلام مصطفي كتب:

و يبدو اني اواجه مشكلة مع setAlignment لأزار ال ( Justify )

استخدمت هذا و لكن بها مشكلة

self.connect(self.setBold, SIGNAL('clicked()'), self.textArea, SLOT('setFontWeight(1)'))
        self.connect(self.setUnderline, SIGNAL('clicked()'), self.textArea, SLOT('setFontUnderline(True)'))
        self.connect(self.setItalic, SIGNAL('clicked()'), self.textArea, SLOT('setFontItalic()'))
        self.connect(self.justifyLeft, SIGNAL('clicked()'), self.textArea, SLOT("setAlignment('left')"))
        self.connect(self.justifyCenter, SIGNAL('clicked()'), self.textArea, SLOT("setAlignment('center')"))
        self.connect(self.justifyRight, SIGNAL('clicked()'), self.textArea, SLOT("setAlignment('right')"))

لا يجوز ارسال قيم للـ Slot من الكنكت

و يجب ان تكون الـ Slot , Signal ليهم نفس الـ Signature

لو السيجنال بدون متغيرات يبقى لازم يكون السلوت بدون متغيرات

الحل

اعمل دوال مثل ()setJustLeft

واعمل الكنكت معها

وهي اللي تقوم بالمهمة

تحياتي

تم تعديل هذه المشاركة بواسطة ihope في 15 أغسطس 2011 في 22:33

1

other ESTJ thing

اقتباس
Help Me To Help You

0xBAD00DAD.png

#17
ihope كتب:

اولا موضوع الترميز encoding استخدم موديول chardet لايجاد ترميز الملف

easy_install chardet

>>> import chardet
>>> chardet.detect(urlread("http://google.cn/"))
{'encoding': 'GB2312', 'confidence': 0.99}

وانظر مثال

pyside-pyside-examples\examples\tools\codecs

ان لم يكن لديك امثلة pyside

pyside-pyside-examples-master.tar.gz

تحياتي

اشكرك جاري التحميل

ihope كتب:

لا يجوز ارسال قيم للـ Slot من الكنكت

و يجب ان تكون الـ Slot , Signal ليهم نفس الـ Signature

لو السيجنال بدون متغيرات يبقى لازم يكون السلوت بدون متغيرات

الحل

اعمل دوال مثل ()setJustLeft

واعمل الكنكت معها

وهي اللي تقوم بالمهمة

تحياتي

معلومة جديدة ! جاري عمل التعديلات اللازمة :)

شكرا مرة اخري

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…