2015-06-03 69 views
6

我還沒有決定爲我的下一個項目使用什麼語言和工具。我很想使用Python,但我想實現功能區工具欄。 Tk已經完成了一些工作(http://www.ellogon.org/petasis/bibliography/Tcl2010/TkRibbon.pdf),但它看起來還沒有在tkinter中實現。有什麼我可以做得到這個工作嗎?有沒有在Tkinter中使用Ribbon工具欄的方法?

+1

我想你會需要在'tkribbon'周圍編寫自己的包裝庫,因爲顯然沒有人做過它。或者寫一些代碼來模擬那種工具欄... – nbro

回答

6

您需要爲此創建一個包裝並獲取可以使用的二進制版本。我構建了這個與Python 3.4一起使用,並將其複製到tkribbon1.0-x86_64.zip。您應該將其解壓縮到Python/tcl子目錄中,以便python使用的tcl版本可以加載它。

的最小包裝看起來是這樣的:

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() 

運行此使用內置的資源,tkribbon DLL,看起來像this screenshot。複雜的一點是將一些Ribbon標記資源加載到DLL中進行加載。

您可以使用此示例從現有應用程序加載色帶。例如,python Ribbon.py c:\Windows\System32\mspaint.exe MSPAINT_RIBBON將從mspaint加載功能區資源。這種情況下的資源名稱必須包含在內,因爲默認值是APPLICATION_RIBBON。爲了您自己的功能區,使用uicc生成一個.rc文件,然後rc /r file.rc生成.res文件,最後link -dll -out:file.dll file.rc -noentry -machine:AMD64似乎可以生成僅適用於此擴展的資源的DLL。

+0

我已經嘗試過了,它的確工作很合理,所以經過一段時間後,我會接受它。不過,也許有人會寫封包。 – chaosflaws

+0

這個作品非常漂亮。非常感謝 ! – rvcristiand