القطعة دفتر في Tkinter
سؤال
وبعد أن لعبت في جميع أنحاء قليلا مع كل Tkinter وكسبيثون، أنا أحب Tkinter أفضل بكثير من حيث كيفية تنظيف يبدو لي شفرة المصدر. ومع ذلك، فإنه لا يبدو أن لديها العديد من الميزات. على وجه الخصوص ليس لديها علامات التبويب (كما هو الحال في علامات التبويب في الجزء العلوي من نافذة فايرفوكس).
وA غوغلينغ قليلا على هذا الموضوع يقدم بعض الاقتراحات. هناك href="http://code.activestate.com/recipes/188537/" إدخال كتاب طبخ مع فئة مما يتيح لك استخدام علامات التبويب، لكنها بدائية جدا. هناك أيضا بيثون megawidgets على سورس، على الرغم من أن هذا يبدو قديمة جدا وأعطاني أخطاء أثناء التثبيت.
هل لديها الخبرة مما يجعل اجهات تفاعلية في Tkinter؟ ماذا استخدمت؟ أم أنها مجرد حالة أن أي شخص يحتاج مكونات النوافذ أكثر قوة أن استخدام كسبيثون؟
المحلول
في بيثون الأخير (> 2.7) الإصدارات، يمكنك استخدام ttk
وحدة، والتي توفر الوصول إلى <م> تاكا تحت عنوان القطعة م> مجموعة، والتي تم تقديمها في Tk 8.5
.
وهنا كيف يمكنك استيراد ttk
في بايثون 2:
import ttk
help(ttk.Notebook)
في بيثون 3، و ttk
وحدة يأتي مع التوزيعات القياسية باعتباره حدة ثانويه من tkinter
.
وفيما يلي مثال عملي بسيط يقوم على سبيل المثال من TkDocs
الموقع:
from tkinter import ttk
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
def demo():
root = tk.Tk()
root.title("ttk.Notebook")
nb = ttk.Notebook(root)
# adding Frames as pages for the ttk.Notebook
# first page, which would get widgets gridded into it
page1 = ttk.Frame(nb)
# second page
page2 = ttk.Frame(nb)
text = ScrolledText(page2)
text.pack(expand=1, fill="both")
nb.add(page1, text='One')
nb.add(page2, text='Two')
nb.pack(expand=1, fill="both")
root.mainloop()
if __name__ == "__main__":
demo()
وثمة بديل آخر هو استخدام القطعة NoteBook
من المكتبة tkinter.tix
. لاستخدام tkinter.tix
، يجب أن يكون لديك الحاجيات Tix
المثبتة، عادة إلى جانب تثبيت الحاجيات Tk
. لاختبار التثبيت، جرب ما يلي:
from tkinter import tix
root = tix.Tk()
root.tk.eval('package require Tix')
لمزيد من المعلومات، راجع هذه على موقع PSF .
لاحظ أن tix
قديمة جدا وغير معتمدة بشكل جيد، لذلك افضل خيار لكم قد يكون للذهاب لttk.Notebook
.
نصائح أخرى
وإذا كان أي شخص لا تزال تبحث، لقد حصلت على هذا العمل كما علامة تبويب في tkinter. لعب حولها مع رمز لجعلها تعمل بالطريقة التي تريدها (على سبيل المثال، يمكنك إضافة زر لإضافة علامة تبويب جديدة):
from tkinter import *
class Tabs(Frame):
"""Tabs for testgen output"""
def __init__(self, parent):
super(Tabs, self).__init__()
self.parent = parent
self.columnconfigure(10, weight=1)
self.rowconfigure(3, weight=1)
self.curtab = None
self.tabs = {}
self.addTab()
self.pack(fill=BOTH, expand=1, padx=5, pady=5)
def addTab(self):
tabslen = len(self.tabs)
if tabslen < 10:
tab = {}
btn = Button(self, text="Tab "+str(tabslen), command=lambda: self.raiseTab(tabslen))
btn.grid(row=0, column=tabslen, sticky=W+E)
textbox = Text(self.parent)
textbox.grid(row=1, column=0, columnspan=10, rowspan=2, sticky=W+E+N+S, in_=self)
# Y axis scroll bar
scrollby = Scrollbar(self, command=textbox.yview)
scrollby.grid(row=7, column=5, rowspan=2, columnspan=1, sticky=N+S+E)
textbox['yscrollcommand'] = scrollby.set
tab['id']=tabslen
tab['btn']=btn
tab['txtbx']=textbox
self.tabs[tabslen] = tab
self.raiseTab(tabslen)
def raiseTab(self, tabid):
print(tabid)
print("curtab"+str(self.curtab))
if self.curtab!= None and self.curtab != tabid and len(self.tabs)>1:
self.tabs[tabid]['txtbx'].lift(self)
self.tabs[self.curtab]['txtbx'].lower(self)
self.curtab = tabid
def main():
root = Tk()
root.geometry("600x450+300+300")
t = Tabs(root)
t.addTab()
root.mainloop()
if __name__ == '__main__':
main()
وعلى الرغم من أنه قد لا تساعدك في لحظة والمعارف التقليدية 8.5 يأتي مع مجموعة موسعة من الحاجيات. هذه المجموعة الموسعة يتوفر مع المعارف التقليدية 8.4 عن طريق امتدادا المعروفة باسم "البلاط". وشملت في مجموعة موسعة من الحاجيات هو القطعة دفتر الملاحظات. لسوء الحظ، في هذا الوقت Tkinter افتراضيا يستخدم نسخة قديمة إلى حد ما تاكا التي لا تأتي مع هذه الحاجيات.
وكانت هناك جهود لجعل البلاط المتاحة لTkinter. تحقق من http://tkinter.unpythonic.net/wiki/TileWrapper . لجهد آخر مماثل رؤية http://pypi.python.org/pypi/pyttk . أيضا، لتذوق كيف تبدو هذه الحاجيات (في روبي، وبيرل وتى سى ال) راجع HTTP: //www.tkdocs. كوم / .
وتاكا 8.5 هو تحسن ضخمة م> على تاكا الأسهم. إنه يطرح جملة من الحاجيات الجديدة، والحاجيات الأم، ومحرك سمات. نأمل أنها سوف تكون متاحة بشكل افتراضي في Tkinter يوما ما قريبا. سيئة للغاية في العالم بيثون لا يزال متخلفا لغات أخرى.
تحديث: أحدث إصدارات بيثون الآن تشمل دعم الحاجيات تحت عنوان من خارج منطقة الجزاء. _ م>
و"أم أنها مجرد حالة أن أي شخص يحتاج مكونات النوافذ أكثر قوة أن استخدام كسبيثون؟"
الجواب باختصار: نعم
والإجابة الطويلة: قد يستغرق بعض الممارسات لرمز كسبيثون ليشعر "نظيفة"، ولكن من أجمل وأكثر قوة من Tkinter. سوف تحصل أيضا على دعم أفضل، منذ أكثر الناس استخدامها هذه الأيام.
ما هي المشاكل هل لديك مع PMW؟ أنها قديمة، نعم، ولكن هذا الثعبان النقي لذلك يجب أن تعمل.
لاحظ أن TIX لا يعمل مع py2exe، إذا كان هذا هو مشكلة بالنسبة لك.