سؤال

وبيثون لديها الكثير من المكتبات واجهة المستخدم الرسومية: tkinter، كويدغيتس، جتك الخ ولكن تحتاج الى كل هذه اجهات ليتم تثبيتها والوزن الثقيل جدا، لذلك فمن معقدة بعض الشيء لنشر المستخدم النهائي التطبيقات GUI الثعبان التي تعتمد بصورة أساسية على المكتبات واجهة المستخدم الرسومية المذكورة.

ومؤخرا، لقد فكرت في وحدة ctypes المدمج في بايثون. من الناحية النظرية، فمن الممكن لإنشاء مكتبة واجهة المستخدم الرسومية الثعبان النقية التي سوف تستخدم ctypes على النوافذ (windll.user32.CreateWindowEx، الخ)، وpyObjC أصلي على ماك وجتك / باي كيوت على جنوم / كيدي. لا توجد مثل هذه المكتبة؟ إذا لم يكن كذلك، ما رأيك هو الخطأ في هذه الفكرة؟

هل كانت مفيدة؟

المحلول

ومسار أقل جهد وأفضل النتائج ستكون لمعرفة ما يلزم لنشر التطبيق باستخدام هذه المكتبات واجهة المستخدم الرسومية القائمة.

نصائح أخرى

والبدء في بيثون 2.7 و 3.1، سوف تاكا تبدو أفضل كثيرا.

HTTP: //docs.python. غزاله / ديف / whatsnew / 2.7.html # تك تحت عنوان-الحاجيات مقابل المعارف التقليدية

و"تى سى ال / تاكا 8.5 يتضمن مجموعة من الحاجيات تحت عنوان أن إعادة تنفيذ الحاجيات تاكا الأساسية ولكن لديها مظهر أكثر للتخصيص، وبالتالي يمكن أكثر شبها الحاجيات منصة الأم و، سميت هذه المجموعة القطعة أصلا بلاطة، ولكن تم تغيير اسمها ل تك (لل"تاكا تحت عنوان") على إضافتها إلى تى سى ال / TCK الإفراج 8.5 ".

وTkinter هو جزء من التوزيع القياسي الثعبان ويتم تثبيت افتراضيا. نتوقع أن نجد هذا على كل الثعبان بتثبيت حيث كان هناك عرض رسومية في المقام الأول.

ومفهوم "مكتبة واجهة المستخدم الرسومية بيثون النقي" خطأ أنه في نهاية المطاف سوف تستخدم المكالمات والحاجيات على مستوى النظام، قد يكون من خلال ctypes ولكن هذا لا يغير من حقيقة أنه إذا كنت بدء تنفيذ فكرتك سوف تصبح في نهاية المطاف كسبيثون

ويقوم هذا ما هو الخطأ هو أنه إعادة اختراع العجلات التي تم القيام به بالفعل من قبل صناع GTK، تاكا، WX، QT وأمثالهم. في حين أن الثعبان GUI النقي هو ممكن من الناحية الفنية، والمشاريع مثل anygui لم تحاول شيئا من هذا القبيل، وهناك القليل نسبيا لل الحصول من خلال ذلك.

ومجموعات الأدوات الأم ستفعل أيضا بعمل أفضل تغطية الفروقات بين الأنظمة الأساسية الكامنة وراء (الحوارات الأم وما إلى ذلك). وهذا يعني أن الأدوات تسمح لك لكتابة تطبيق المحمولة التي تحتاج القليل إذا كان أي منصة رمز معين - معظم هذه تستخرج من الأدوات الأساسية

وآليات توزيع مثل py2exe على النوافذ وأي من لينكس وسائل تسمح لك لحزمة دلس مع التطبيق، حتى تتمكن من تقديم المثبت الذي يسقط أي المكونات الأصلية فإنه يحتاج إلى المكان. ومع ذلك، ليس هناك حقا وسيلة عامة عبر منصة للقيام بذلك لذلك سوف تحتاج إلى الحفاظ على التركيب منفصلة لكل منصة.

لشيء واحد، كل هذه المكتبات استخدام المجردات مختلفة، لذلك كل ما عملت مع كل منهم من المرجح أن يختتم دعم مجموعة أقل القاسم المشترك من وظائف، <م> أو تفعل الكثير من العمل على استخدام كل على أكمل وجه.

وليس متأكدا ما تعنيه ب "الوزن الثقيل".

وWX يستخدم عناصر الأم على كل منصة، وحوالي سهلا كما لاستخدامها في بيثون ما أستطيع أن أتخيل. بعد كل شيء، واجهات برمجة التطبيقات واجهة المستخدم الرسومية معقدة بسبب اجهات يمكن الحصول على المجمع.

وأعتقد WX، عن الجهد المطلوب لبناء النافذة ونوعية ما يظهر على الشاشة، هي كبيرة. لا أعتقد أنت من المحتمل أن يلف شيء أفضل لوحدك.

واعتقد انه لا حول inventig عجلة القيادة. وسوف تعمل، ولكن لماذا يجب عليك أن تفعل ذلك؟ كافة المكتبات واجهة المستخدم الرسومية التي ذكرتها هي مستقرة وأكثر من ذلك أو أقل رصاصة proofen.

ويمكن أن أتصور أن هناك بعض التجارب تنفيذ مكتبة بيثون نقية. لكنني لم أر واحدة. كل شيء عن اجهات هو العمل الشاق، وسوف مكتبة بيثون نقية ليس لديها مثل جمهور كبير.

وماذا عن مجمع خفيفة الوزن حول tkinter بحيث أنها لا تتطلب الكثير من الإعداد؟ PySimpleGUI هو مبني على رأس tkinter مما يعني أنه يدير يدير tkinter في كل مكان.

ووميزة على استخدامه مقابل tkinter هو مقدار التعليمات البرمجية التي يتم المطلوبة. برامج PySimpleGUI تميل إلى أن تكون صغيرة الحجم حقا.

وهنا مثال يظهر تخطيط مخصص باستخدام العديد من الأدوات المتاحة.

ورمز لتوليد أنه في نهاية المطاف. قد يبدو مثل الكثير من التعليمات البرمجية، ولكن هذا كل شيء. ان الامر سيستغرق صفحات وصفحات وصفحات من التعليمات البرمجية tkinter أن تفعل الشيء نفسه.

import PySimpleGUI as sg

sg.ChangeLookAndFeel('GreenTan')
# ------ Menu Definition ------ #
menu_def = [['&File', ['&Open', '&Save', 'E&xit', 'Properties']],
            ['&Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],
            ['&Help', '&About...'], ]
# ------ Column Definition ------ #
column1 = [[sg.Text('Column 1', background_color='lightblue', justification='center', size=(10, 1))],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')]]

layout = [
    [sg.Menu(menu_def, tearoff=True)],
    [sg.Text('(Almost) All widgets in one Window!', size=(30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
    [sg.Text('Here is some text.... and a place to enter text')],
    [sg.InputText('This is my text')],
    [sg.Frame(layout=[
    [sg.Checkbox('Checkbox', size=(10,1)),  sg.Checkbox('My second checkbox!', default=True)],
    [sg.Radio('My first Radio!     ', "RADIO1", default=True, size=(10,1)), sg.Radio('My second Radio!', "RADIO1")]], title='Options',title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='Use these to set flags')],
    [sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(35, 3)),
     sg.Multiline(default_text='A second multi-line', size=(35, 3))],
    [sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1)),
     sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)],
    [sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
    [sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)),
     sg.Frame('Labelled Group',[[
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25),
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75),
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10),
     sg.Column(column1, background_color='lightblue')]])],
    [sg.Text('_' * 80)],
    [sg.Text('Choose A Folder', size=(35, 1))],
    [sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
     sg.InputText('Default Folder'), sg.FolderBrowse()],
    [sg.Submit(tooltip='Click to submit this form'), sg.Cancel()]]

window = sg.Window('Everything bagel', default_element_size=(40, 1), grab_anywhere=False).Layout(layout)
button, values = window.Read()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top