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

ممكن مصمم واجهات رسومية لبايثون؟؟

بدأه AboShabrah في 12 أبريل 2011 · 15 رد · 2,323 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم

اخواني ممكن مصمم واجهات للبايثون انا عندي معرفة في اساسيات اللغة وبغيت انتقل للواجهة الرسومية لكن ماودي اكتبها بالكود ممكن اكتب شئ بسيط لكن ان كان البرمامج كبير حتتين وش اسوي

انا ماعندي اي مشكلة تكون gtk ot qt لكن ابي مصمم واجهات جربت glade شفتة رائع لكن اولت احوله الى كود بايثون ببرنامج جلادزر حق احمد يوسف وولا نفع

مستني ردودكم

سبحان الله وبحمده - - - سبحان الله العظيم

#2

طبعاً ممكن. في السابق استخدمت BoaConstructor الذي يدعم wxPython وهي نسخة بايثونية من wxWindows

http://boa-constructor.sourceforge.net/

#4

مع PyQt يتم تثبيت Qt Designer و الذي يمكنك من تصميم الواجهة كما تشاء ثم يتم تحويلها من .ui إلى .py عن طريق pyuic

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#5

BoaConstructor متوقف التطوير فيها ربما wxGlade او wxFormBuilder

انا بستخدم Qt Designer كتطبيق منفرد

ممكن تقلنا ايه المشكلة اللي بتظهرلك مع جلاديزر ؟

(map share people)

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

#6
اقتباس
Traceback (most recent call last):

File "gladizer.py", line 337, in <module>

main()

File "gladizer.py", line 332, in main

print cg.generate()

File "gladizer.py", line 305, in generate

return p.generate_code()

File "gladizer.py", line 132, in generate_code

return self.header_and_imports()+self.code_body() + self.callbacks() + self.test()+ self.commonfooter()

File "gladizer.py", line 173, in code_body

cbody +="\t\tself._%s.show()"%self._widgets[0]

IndexError: list index out of range

سبحان الله وبحمده - - - سبحان الله العظيم

#7
sada_rohak كتب:

وعليكم السلام

أنا استخدمت pyqt

بواسطة eric

http://eric-ide.python-projects.org/eric-download.html

ولتعلم طريقة تصميم وبرمجة الواجهه

http://eric-ide.python-projects.org/eric-tutorials.html

الله يوفقك طريقتك مرة حلوة !

لكن اذا فعلت حدث الكلك في زر يطلعلي الكود في ملف لحالة مش في الكود تبع الماين ويندو

تم تعديل هذه المشاركة بواسطة AboShabrah في 13 أبريل 2011 في 00:22

سبحان الله وبحمده - - - سبحان الله العظيم

#8

AboShabrah

وياك يارب

عندما تعتاد عليها لن تأخذ سوى دقائق حتى تنتهي من تصميم الواجهة وإعدادها

أيضا أنظر للأدوات المفيده في extras

ستجد ما لا يتوفر في المصمم

مثل كود إستعراض الملفات

والألوان وتصميم رسائل التنبيه

حتى أنك ستجد أداة لتصميم أيقونة البرنامج !

ولو فكرة مستقبلا بعمل برنامج تنفيذي لنظام الويندوز

يمكنك إستخدام py2exe

فهو يدعم pyqt

وبالتوفيق لك

#9

الناتج من py2exe يعمل بدون مفسر البايثون ؟؟

سبحان الله وبحمده - - - سبحان الله العظيم

#10

بالنسبه لسؤالك

لما يطلع لك الملف الجديد

بيكون محتواه كالتالي

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

"""
Module implementing Dialog.
"""

from PyQt4.QtGui import QDialog
from PyQt4.QtCore import pyqtSignature

from Ui_sss import Ui_Dialog

class Dialog(QDialog, Ui_Dialog):
    """
    Class documentation goes here.
    """
    def __init__(self, parent = None):
        """
        Constructor
        """
        QDialog.__init__(self, parent)
        self.setupUi(self)

    @pyqtSignature("")
    def on_pushButton_clicked(self):
        """
        Slot documentation goes here.
        """
        # TODO: not implemented yet
        raise NotImplementedError

-----------

أنت راح تعدله وتخليه هو السكربت الرئيسي

وممكن تعمل ملف ثالث وتخليه الرئيسي

عموما أنا جعلته الملف الرئيسي

أضفت له المكتبات في بدايته

from PyQt4 import QtCore, QtGui

وفي آخره شغلة الكائن الجديد بنفس السكربت

if __name__ == "__main__":

import sys

app = QtGui.QApplication(sys.argv)

Dialog = Dialog()

Dialog.show()

sys.exit(app.exec_())

وفي حدث الكليك اللي عملناه

عملنا طباعة

وسيكون الكود كاملا

----------

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

"""
Module implementing Dialog.
"""

from PyQt4.QtGui import QDialog
from PyQt4.QtCore import pyqtSignature
from PyQt4 import QtCore, QtGui

from Ui_sss import Ui_Dialog

class Dialog(QDialog, Ui_Dialog):
    """
    Class documentation goes here.
    """
    def __init__(self, parent = None):
        """
        Constructor
        """
        QDialog.__init__(self, parent)
        self.setupUi(self)

    @pyqtSignature("")
    def on_pushButton_clicked(self):
        """
        Slot documentation goes here.
        """
        print 'sada_rohak'


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = Dialog()
    Dialog.show()
    sys.exit(app.exec_())

----------

لتعلم أكثر عن pyqt

راجع وثائق موقع أعجوبه

وبالتوفيق لك

py2exe

عباره عن المفسر والمكتبات مضغوطه

راح يكون حجم البرامج كبيره خصوصا لو استخدمت qt

يعني برنامج بسيط حتى لو للجمع والضرب

بيتعدى حجمه 10 ميجا ! :wacko:

عموما سرعات الأنترنت ومواصفات الأجهزه الجديده ما عاد يفرق معها هذا الشي :lol:

يعني المهم ان برنامجك يعمل على العديد من الأنظمه خصوصا لو أستخدمت pyqt

#11

هل تستخدم هذا الإصدار ؟

https://bitbucket.org/xmonader/gladizer

(map share people)

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

#12

والله مدري لكن هذا الكود حق النسخة

اقتباس
#!bin/python

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

#

###############################################

# Author: Ahmed Youssef

# Program: Gladizer v1

# Website: http://www.programming-fr34ks.net

###############################################

# Copyright © 2008, Ahmed Youssef <guru.python@gmail.com>

#

# This program is free software: you can redistribute it and/or modify

# it under the terms of the GNU General Public License as published by

# the Free Software Foundation, either version 3 of the License, or

# (at your option) any later version.

#

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

# GNU General Public License for more details.

#

# You should have received a copy of the GNU General Public License

# along with this program. If not, see <http://www.gnu.org/licenses/>.

#

##DONE

# + Plugin interface

# + Python plugin

# + Ruby plugin

# + Code Generator.

##TODOS:

# -Enable DTD

# -Use minidom instead of XML

# -Add static languages support (Keep track of class attribute <widget class=SOMECLASS id=SOMEID>

# -Add Doc-Strings.

# -Add support for Perl, Java, C/C++

# -Add a man page.

#Imports

import sys

from optparse import OptionParser

from xml import sax

from xml.sax import *

class WidgetModel(object): ##Keep track of the class (e.g class="GtkWindow") for static langugaes. next release.

def __init__(self, signal, handler):

self._signal=signal #signal name..

self._handler=handler

signal=lambda self: self._signal

handler=lambda self: self._handler

__str__=lambda self: "<WidgetModel (%s -> %s)>"%(self._signal, self._handler)

class GladeContentHandler(ContentHandler):

def __init__(self):

self._inwidget=False

self._insignal=False

self._curel=""

self._widgets=[]

self._store=[]

def startElement(self, el, attrs):

self._curel=el

if el=="widget":

self._inwidget=True

self._widgets +=[attrs["id"].replace("-", "_")] #<widget class="GtkWindow" id="window1">

if el=="signal":

self._insignal=True

self._store += [WidgetModel(attrs["name"], attrs["handler"])]

#convert it to a valid python name..

def endElement(self, el):

if el=="widget":

self._inwidget, self._insignal=False, False

def characters(self, content): #should be used with properties

pass

widgets=lambda self:self._widgets

def store(self):

return self._store

def signals(self):

return [x.signal() for x in self._store]

def handlers(self):

return [x.handler() for x in self._store]

def get_root(self):

return self._widgets[0]

class Plugin(object):

def __init__(self, filename, widgets, store, outclass, testable=False):

self._filename=filename

self._widgets=widgets

self._store=store

self._gentest=testable

self._outclass=outclass

def header_and_imports(self):

pass

def code_body(self):

pass

def callbacks(self):

pass

def test(self):

pass

def commonfooter(self):

pass

def generate_code(self):

return self.header_and_imports()+self.code_body() + self.callbacks() + self.test()+ self.commonfooter()

class PythonPlugin(Plugin):

def __init__(self, filename, widgets, store, testable, outclass="MainWindow"):

super(PythonPlugin, self).__init__(filename,widgets, store, outclass, testable)

def header_and_imports(self):

header="""

#!bin/python

##CODE GENERATED by gladizer 1.2

import pygtk

pygtk.require('2.0')

import gtk, gtk.glade

class %s(object):

\tdef __init__(self):

"""%self._outclass

return header

def code_body(self):

cbody="""

\t\t#Widget tree..

\t\tself.wTree=gtk.glade.XML('%s')

\t\t#connect signals and handlers.

\t\tself.wTree.signal_autoconnect(self)

"""%(self._filename)

for w in self._widgets:

cbody +="\t\tself._%s=self.wTree.get_widget('%s')\n"%(w, w)

cbody +="\t\tself._%s.show()"%self._widgets[0]

return cbody

def callbacks(self):

handlers=""

for x in self._store:

handler=x.handler()

signal=x.signal()

#if signal=="delete_event": #do it by hand!

# handlers +="\n\tdef %s(self,widget, *args):\n\t\t\tgtk.main_quit(); return False\n\n"%handler # widget, object

# continue #dobuled if not.

handlers +="""\n\tdef %s(self, widget, *args):\n\t\tpass\n"""%handler #widget, event

return handlers

def test(self):

return "\n"

def commonfooter(self):

footer="""# run main loop\n

def main():

%s = %s()

#%s.%s.show()

gtk.main()

if __name__ == "__main__":

main()

"""%(self._outclass.lower(), self._outclass, self._outclass.lower(), self._widgets[0])

return footer

class RubyPlugin(Plugin):

def __init__(self, filename, widgets, store, testable, outclass="MainWindow"):

super(RubyPlugin, self).__init__(filename,widgets, store, outclass, testable)

def header_and_imports(self):

header="""#!bin/ruby

##This file is generated by Gladizer 1.2

#

#

##

require 'libglade2'

class %s

\tinclude GetText

\tattr :glade

\tdef initialize(path_or_data, root = nil, domain = nil, localedir = nil, flag = GladeXML::FILE)

\t\tbindtextdomain(domain, localedir, nil, "UTF-8")

\t\t@glade = GladeXML.new(path_or_data, root, domain, localedir, flag) {|handler| method(handler)}

"""% self._outclass

return header

def code_body(self):

widgets=""

for w in self._widgets:

widgets +="\t\t@%s=@glade.get_widget('%s')\n\n"%(w, w)

#call the main window show method..

widgets +="\t\t@%s.show"%(self._widgets[0])

return widgets +"\n\tend\n"

def callbacks(self):

handlers=""

for x in self._store:

handler=x.handler()

signal=x.signal()

if signal=="delete_event":

handlers +="\n\tdef %s(widget, arg0)\n\t\t\tGtk.main_quit()\n\n\tend\n"%handler # widget, object

continue #dobuled if not.

handlers +="""\n\tdef %s(widget)\n\t\tputs "Not implemented yet"\n\tend\n"""%handler #widget, event

handlers +="\n\tend"

return handlers

def commonfooter(self):

footer="""# Main program

if __FILE__ == $0

# Set values as your own application.

PROG_PATH = "%s"

PROG_NAME = "%s"

%s.new(PROG_PATH, nil, PROG_NAME)

Gtk.main

end"""%(self._filename, self._outclass, self._outclass)

return footer

def test(self):

return "\n"

class PerlPlugin(Plugin):

def __init__(self, filename, widgets, store, testable, outclass="MainWindow"):

raise NotImplementedError

class JavaPlugin(Plugin):

def __init__(self, filename, widgets, store, testable, outclass="MainWindow"):

raise NotImplementedError

class CodeGenerator(object):

def __init__(self, gladefile="tst.glade", plugin="python"):

self._gladefile=gladefile

self._gh=GladeContentHandler()

self._parser=make_parser()

self._parser.setDTDHandler(0)

self._parser.setContentHandler(self._gh)

#--glade2py

self._parser.setFeature(sax.handler.feature_validation,0)

self._parser.setFeature(sax.handler.feature_external_ges,0)

self._parser.setFeature(sax.handler.feature_external_pes,0)

#--

self._parser.parse(open(self._gladefile))

self._plugin=plugin.lower()

gladefile=lambda self:self._gladefile

plugin=lambda self: self._plugin

def generate(self):

p=None

if self._plugin=="python":

p=PythonPlugin(self._gladefile, self._gh.widgets(), self._gh.store(), False)

return p.generate_code()

elif self._plugin=="ruby":

p=RubyPlugin(self._gladefile, self._gh.widgets(), self._gh.store(), False)

return p.generate_code()

else:

raise NotImplemented, plugin

def usage():

return """gladizer <gladefile> <to>

gladefile => a valid .glade file.

to => [python, ruby, perl]

"""

def main():

optsparser=OptionParser()

optsparser.add_option("-f", "--file", dest="filename", help="Valid glade file.")

optsparser.add_option("-p", "--plugin", dest="plugin", help="Language plugin (Python, Ruby, Perl)")

options, args=optsparser.parse_args() #defaulted to sys.argv[1:]

gladefile=optsparser.values.filename

plugin=optsparser.values.plugin

cg=CodeGenerator(gladefile, plugin)

print cg.generate()

if __name__=="__main__":

main()

sada_rohak كتب:

بالنسبه لسؤالك

لما يطلع لك الملف الجديد

بيكون محتواه كالتالي

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

"""
Module implementing Dialog.
"""

from PyQt4.QtGui import QDialog
from PyQt4.QtCore import pyqtSignature

from Ui_sss import Ui_Dialog

class Dialog(QDialog, Ui_Dialog):
    """
    Class documentation goes here.
    """
    def __init__(self, parent = None):
        """
        Constructor
        """
        QDialog.__init__(self, parent)
        self.setupUi(self)

    @pyqtSignature("")
    def on_pushButton_clicked(self):
        """
        Slot documentation goes here.
        """
        # TODO: not implemented yet
        raise NotImplementedError

-----------

أنت راح تعدله وتخليه هو السكربت الرئيسي

وممكن تعمل ملف ثالث وتخليه الرئيسي

عموما أنا جعلته الملف الرئيسي

أضفت له المكتبات في بدايته

from PyQt4 import QtCore, QtGui

وفي آخره شغلة الكائن الجديد بنفس السكربت

if __name__ == "__main__":

import sys

app = QtGui.QApplication(sys.argv)

Dialog = Dialog()

Dialog.show()

sys.exit(app.exec_())

وفي حدث الكليك اللي عملناه

عملنا طباعة

وسيكون الكود كاملا

----------

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

"""
Module implementing Dialog.
"""

from PyQt4.QtGui import QDialog
from PyQt4.QtCore import pyqtSignature
from PyQt4 import QtCore, QtGui

from Ui_sss import Ui_Dialog

class Dialog(QDialog, Ui_Dialog):
    """
    Class documentation goes here.
    """
    def __init__(self, parent = None):
        """
        Constructor
        """
        QDialog.__init__(self, parent)
        self.setupUi(self)

    @pyqtSignature("")
    def on_pushButton_clicked(self):
        """
        Slot documentation goes here.
        """
        print 'sada_rohak'


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = Dialog()
    Dialog.show()
    sys.exit(app.exec_())

----------

لتعلم أكثر عن pyqt

راجع وثائق موقع أعجوبه

وبالتوفيق لك

py2exe

عباره عن المفسر والمكتبات مضغوطه

راح يكون حجم البرامج كبيره خصوصا لو استخدمت qt

يعني برنامج بسيط حتى لو للجمع والضرب

بيتعدى حجمه 10 ميجا ! :wacko:

عموما سرعات الأنترنت ومواصفات الأجهزه الجديده ما عاد يفرق معها هذا الشي :lol:

يعني المهم ان برنامجك يعمل على العديد من الأنظمه خصوصا لو أستخدمت pyqt

الله يعطيك العافية ماقصرت ابي احاول في الطريقة ذي لين افهمها ثنكس !

سبحان الله وبحمده - - - سبحان الله العظيم

#13

طب للتحميل من هنا وجرب مرة اخرى

https://bitbucket.org/xmonader/gladizer/get/777c09996730.zip

في كل الأحوال هو محتاج مزيد من التحسينات

(map share people)

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

#14

ماشاء الله يااحمد لكن حبيبي فية مشكلة بسيطة وتصليحها سهل

الي هي

اقتباس
gtkbuilder...

# #builder

self.builder=gtk.Builder()

self.builder.add_from_file("tst.glade")

#connect signals and handlers.

self.builder.connect_signals(self)

self._window1=self.builder.get_object('window1')

self._fixed1=self.builder.get_object('fixed1')

self._button1=self.builder.get_object('button1')

#!bin/python

##CODE GENERATED by gladizer 1.2

import pygtk

pygtk.require('2.0')

import gtk

class MainWindow(object):

def __init__(self):

# #builder

self.builder=gtk.Builder()

self.builder.add_from_file("tst.glade")

#connect signals and handlers.

self.builder.connect_signals(self)

self._window1=self.builder.get_object('window1')

self._fixed1=self.builder.get_object('fixed1')

self._button1=self.builder.get_object('button1')

self._window1.show()

def Clic(self, widget, *args):

print "Ok!"

# run main loop

def main():

mainwindow = MainWindow()

#mainwindow.window1.show()

gtk.main()

if __name__ == "__main__":

main()

مادري وش فايدة الي فوق #!bin/python المهم اني احذفها ويشتغل البرنامج تمام !

سبحان الله وبحمده - - - سبحان الله العظيم

#15
#!bin/python

تحدد مسار المفسر في نظام لينكس ^_^

#16
sada_rohak كتب:

#!bin/python

تحدد مسار المفسر في نظام لينكس ^_^

الله يسعدك حبيبي عارف وانا استعمل اللينكس اصلا لكن انا اقصد الي فوقها يجب حذفة لكي يعمل البرنامج

سبحان الله وبحمده - - - سبحان الله العظيم

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