2015-06-03 8 views
6

Devo ancora decidere quale lingua e strumenti utilizzare per il mio prossimo progetto. Mi piacerebbe usare python, ma mi piacerebbe implementare le barre degli strumenti del nastro. Alcuni lavori sono stati eseguiti in Tk (http://www.ellogon.org/petasis/bibliography/Tcl2010/TkRibbon.pdf), ma sembra che non sia ancora stato implementato in tkinter. C'è qualcosa che posso fare per farlo funzionare?C'è un modo per usare barre degli strumenti nastro in Tkinter?

+1

Immagino che avresti bisogno di scrivere la tua libreria di wrapper attorno a 'tkribbon', poiché apparentemente nessuno l'ha ancora fatto. O scrivi del codice per simulare quel tipo di barra degli strumenti ... – nbro

risposta

6

È necessario creare un wrapper per questo e ottenere una versione del file binario che è possibile utilizzare. Ho costruito questo per l'uso con Python 3.4 e copiato su tkribbon1.0-x86_64.zip. Dovresti decomprimere questo nella sottodirectory Python/tcl in modo che la versione di tcl usata da python possa caricarla.

Un wrapper minimo simile a questa:

from tkinter import Widget 
from os import path 

class Ribbon(Widget): 
    def __init__(self, master, kw=None): 
     self.version = master.tk.call('package','require','tkribbon') 
     self.library = master.tk.eval('set ::tkribbon::library') 
     Widget.__init__(self, master, 'tkribbon::ribbon', kw=kw) 

    def load_resource(self, resource_file, resource_name='APPLICATION_RIBBON'): 
     """Load the ribbon definition from resources. 

     Ribbon markup is compiled using the uicc compiler and the resource included 
     in a dll. Load from the provided file.""" 
     self.tk.call(self._w, 'load_resources', resource_file) 
     self.tk.call(self._w, 'load_ui', resource_file, resource_name) 

if __name__ == '__main__': 
    import sys 
    from tkinter import * 
    def main(): 
     root = Tk() 
     r = Ribbon(root) 
     name = 'APPLICATION_RIBBON' 
     if len(sys.argv) > 1: 
      resource = sys.argv[1] 
      if len(sys.argv) > 2: 
       name = sys.argv[2] 
     else: 
      resource = path.join(r.library, 'libtkribbon1.0.dll') 
     r.load_resource(resource, name) 
     t = Text(root) 
     r.grid(sticky=(N,E,S,W)) 
     t.grid(sticky=(N,E,S,W)) 
     root.grid_columnconfigure(0, weight=1) 
     root.grid_rowconfigure(1, weight=1) 
     root.mainloop() 
    main() 

L'esecuzione di questo utilizza le risorse built-in alla DLL tkribbon e si presenta come this screenshot. Il bit complicato sta per ottenere alcune risorse di markup Ribbon in una DLL per il caricamento.

È possibile utilizzare questo esempio per caricare i nastri da applicazioni esistenti. Ad esempio, python Ribbon.py c:\Windows\System32\mspaint.exe MSPAINT_RIBBON caricherà la risorsa nastro da mspaint. Il nome della risorsa in questo caso deve essere incluso poiché l'impostazione predefinita è APPLICATION_RIBBON. Per il tuo nastro, utilizzando uicc per creare un file .rc, quindi rc /r file.rc per produrre un file .res e infine link -dll -out:file.dll file.rc -noentry -machine:AMD64 sembra funzionare per produrre una risorsa solo DLL che funziona con questa estensione.

+0

L'ho provato e ha funzionato abbastanza bene, quindi dopo un po 'di tempo, lo accetterò. Forse un giorno qualcuno scriverà un involucro, comunque. – chaosflaws

+0

Funziona molto bene. Molte grazie ! – rvcristiand

Problemi correlati