it-swarm.dev

أفضل طريقة لهيكلة تطبيق tkinter؟

ما يلي هو الهيكل العام لبرنامجي الثعبان tkinter نموذجي.

def funA():
    def funA1():
        def funA12():
            # stuff

    def funA2():
        # stuff

def funB():
    def funB1():
        # stuff

    def funB2():
        # stuff

def funC():
    def funC1():
        # stuff

    def funC2():
        # stuff


root = tk.Tk()

button1 = tk.Button(root, command=funA)
button1.pack()
button2 = tk.Button(root, command=funB)
button2.pack()
button3 = tk.Button(root, command=funC)
button3.pack()

funAfunB و funC سيطرحان نوافذ Toplevel أخرى مع عناصر واجهة مستخدم عندما ينقر المستخدم على زر 1 و 2 و 3.

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

هل هناك أي هيكل محدد يجب أن نتبعه كممارسة جيدة؟ كيف يجب أن أخطط قبل البدء في كتابة برنامج بيثون؟

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

98
Chris Aung

أنا أدعو إلى نهج وجوه المنحى. هذا هو القالب الذي أبدأ به:

# Use Tkinter for python 2, tkinter for python 3
import tkinter as tk

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent

        <create the rest of your GUI here>

if __== "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

الأشياء المهمة التي يجب ملاحظتها هي:

  • لا أستخدم استيراد بدل. أقوم باستيراد الحزمة كـ "tk" ، الأمر الذي يتطلب أن أسبق كل الأوامر بـ tk.. هذا يمنع تلوث مساحة الاسم العالمية ، بالإضافة إلى أنه يجعل الكود واضحًا تمامًا عند استخدامك لفئات Tkinter ، أو فئات ttk ، أو بعض خاصة بك.

  • التطبيق الرئيسي هو فئة . يمنحك هذا مساحة اسم خاصة لجميع عمليات الاسترجاعات والوظائف الخاصة ، ويسهل بشكل عام تنظيم التعليمات البرمجية الخاصة بك. بأسلوب إجرائي ، يجب عليك كتابة رمز من أعلى لأسفل ، وتحديد الوظائف قبل استخدامها ، وما إلى ذلك. وبهذه الطريقة ، لا تقوم بذلك لأنك لا تنشئ النافذة الرئيسية فعليًا حتى الخطوة الأخيرة. أفضل التوريث من tk.Frame لمجرد أنني أبدأ بإنشاء إطار ، لكن هذا ليس ضروريًا بأي حال من الأحوال.

إذا كان التطبيق الخاص بك يحتوي على نوافذ كبيرة إضافية ، فنوصيك بجعل كلٍ من هذه الفئات فئة منفصلة ، وراثة من tk.Toplevel. يمنحك هذا جميعًا نفس الميزات المذكورة أعلاه - النوافذ ذرية ، ولديها مساحة اسم خاصة بها ، والرمز منظم جيدًا. بالإضافة إلى ذلك ، فإنه يجعل من السهل وضع كل منها في الوحدة النمطية الخاصة بها بمجرد أن يبدأ رمز الحصول على كبيرة.

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

class Navbar(tk.Frame): ...
class Toolbar(tk.Frame): ...
class Statusbar(tk.Frame): ...
class Main(tk.Frame): ...

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.statusbar = Statusbar(self, ...)
        self.toolbar = Toolbar(self, ...)
        self.navbar = Navbar(self, ...)
        self.main = Main(self, ...)

        self.statusbar.pack(side="bottom", fill="x")
        self.toolbar.pack(side="top", fill="x")
        self.navbar.pack(side="left", fill="y")
        self.main.pack(side="right", fill="both", expand=True)

نظرًا لأن كل هذه الحالات تشترك مع أحد الوالدين المشتركين ، يصبح الوالد فعليًا جزء "وحدة التحكم" في بنية وحدة تحكم طريقة العرض. لذلك ، على سبيل المثال ، يمكن أن تضع النافذة الرئيسية شيئًا ما على شريط المعلومات عن طريق الاتصال بـ self.parent.statusbar.set("Hello, world"). يتيح لك ذلك تحديد واجهة بسيطة بين المكونات ، مما يساعد في الحفاظ على اقتران الحد الأدنى.

188
Bryan Oakley

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

import tkinter as tk

class Demo1:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.button1 = tk.Button(self.frame, text = 'New Window', width = 25, command = self.new_window)
        self.button1.pack()
        self.frame.pack()
    def new_window(self):
        self.newWindow = tk.Toplevel(self.master)
        self.app = Demo2(self.newWindow)

class Demo2:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows)
        self.quitButton.pack()
        self.frame.pack()
    def close_windows(self):
        self.master.destroy()

def main(): 
    root = tk.Tk()
    app = Demo1(root)
    root.mainloop()

if __== '__main__':
    main()

انظر أيضا:

امل ان يساعد.

27
alecxe

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

إذن ما يمكنك فعله هو كتابة فئات لها ، ثم استخدام أساليب في الفصل تتعامل مع الأوامر الخاصة بنقرات الأزرار وما شابه.

إليك مثال:

import tkinter as tk

class Window1:
    def __init__(self, master):
        pass
        # Create labels, entries,buttons
    def button_click(self):
        pass
        # If button is clicked, run this method and open window 2


class Window2:
    def __init__(self, master):
        #create buttons,entries,etc

    def button_method(self):
        #run this when button click to close window
        self.master.destroy()

def main(): #run mianloop 
    root = tk.Tk()
    app = Window1(root)
    root.mainloop()

if __== '__main__':
    main()

عادة ما تكون برامج tk ذات النوافذ المتعددة عبارة عن فئات كبيرة متعددة ، وفي __init__ يتم إنشاء جميع الإدخالات والعلامات وما إلى ذلك ، ثم كل طريقة للتعامل مع أحداث النقر على الزر

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

نلقي نظرة على التفكير في Tkinter .

4
Serial

يجب أن يكون OOP هو النهج و frame يجب أن يكون متغير فئة بدلاً من متغير مثيل .

from Tkinter import *
class App:
  def __init__(self, master):
    frame = Frame(master)
    frame.pack()
    self.button = Button(frame, 
                         text="QUIT", fg="red",
                         command=frame.quit)
    self.button.pack(side=LEFT)
    self.slogan = Button(frame,
                         text="Hello",
                         command=self.write_slogan)
    self.slogan.pack(side=LEFT)
  def write_slogan(self):
    print "Tkinter is easy to use!"

root = Tk()
app = App(root)
root.mainloop()

 enter image description here 

المرجع: http://www.python-course.eu/tkinter_buttons.php

1
Nik