2014-01-06 216 views
2

我認爲透明是我正在尋找的正確詞彙。無論如何,希望我的描述能夠正確解釋它。python tkinter帆布'透明'

我有幾十年來基於時間的數據圖。非常簡單地設置爲每x像素顯示一天,除非放大更近。我想有一個盒子,可能沿着5x100的線條出現在圖表的頂部,所以當我將鼠標移動到圖表上時,盒子將移動並與鼠標保持同步。另一個詞顯示了前幾天'最近幾天'發生的事情。計算平均值時的另一個字是什麼,隨着新數據的到來,下一個值會下降。當然,我希望底層的圖形數據能夠在透明框的頂部顯示出相關的日子。這可能會變得足夠瘋狂成爲一個更寬的盒子,其中兩個區域是淺灰色或類似的區域,用於顯示有問題的區域,但彩色區域被分隔很多天(可能是多個透明窗口,它們一起跟蹤是一傢俱有Tkinter的這可行嗎?從我的研究一直在做,如果使用

root.attributes('alpha', .30) 

將工作或不值得懷疑,這聽起來並不像我可以做這樣的事情,因爲這將最終使該圖透明的,無論是它的下面。

​​

如果我理解正確的話我一定要使用

attributes 

正確的根級別與個人的'窗口'級別,所以上述(嚴重砍下)的代碼將無法正常工作......或將它。我還沒有機會嘗試任何東西,看看會發生什麼... ...將在今晚晚些時候。有點希望能夠通過問現在節省一點時間,而且你永遠不知道還有誰可能需要幫助。

+0

這是否與Tkinter?因爲如果我明白你要求的是什麼,這將是非常困難的,而且,例如PySide或者wx或者其他幾乎任何東西都會更容易。 – abarnert

回答

2

如果我明白你想要做什麼,這將是非常困難的。

設置窗口屬性可以很好地使窗口透明。你有一個小問題在代碼屬性開始一個連字符,否則你得到它的權利:

self.Box.attributes("-alpha", .30) 

然而,這聽起來像你想的是Box是圖的預埋件窗口,而不是它自己的頂層窗口,可以被用戶拖拽,等等。不幸的是,Tkinter沒有任何兒童窗口的概念,並且它沒有暴露出足夠的本地東西,你需要僞造他們通過創建一個不可移動的窗口並手動移動它來跟蹤另一個窗口的移動。所以,你沒有窗戶,這意味着你沒有窗戶的透明度。

Box的一個顯而易見的東西是某種小部件,如FrameCanvas。但小部件不具有透明度。

Box可以替代地僅僅是與Graph相同的Canvas上繪製的元素的集合。這似乎很有前途......但Canvas方法沒有處理alpha透明度。 (他們中的一些處理全有或全無透明,但這沒有幫助。)

有一點確實處理透明度是PhotoImage。因此,如果您在屏幕外繪製Box,則將得到的內容作爲PhotoImage,添加alpha(例如,通過PIL),然後create_image結果...關閉,但不包含雪茄。根據底層Tk庫的設置,Tkinter可能會以1位透明度繪製像素圖或完全忽略透明度。 (嘗試在PIL中加載alpha透明PNG文件並將它們繪製在Canvas上。)所以,除非你想要一個在某些系統上看起來正確的應用程序,不會在其他系統上繪製Box,並且在其他人上繪製它不透明,這是一個死路一條。

那麼,剩下的是什麼?只有人工合成:繪製Graph和單獨的屏幕外的窗口Box,獲得像素映射,使用PIL撰寫他們,create_image結果。

此時你可能會更好過只用類似PIL的ImageDraw或更強大的圖書館建設擺在首位的像素圖。或者,當然,使用比Tk更強大的GUI庫,如Qt或wx。

+0

從我迄今爲止讀過的內容中知道,這聽起來確實值得懷疑。這是我將要玩的東西,也可以嘗試一些其他的想法。我不會介意和Tk呆在一起,因爲我迄今爲止只用它來繪製相關的任何圖形,所以我可能不得不嘗試用其他方式來做我想要完成的事情,數據即將被取出平均方程。 – confused

+0

@confused:寫完後,我發現它比我想象的更有趣。我無法找到任何可讓您在Windows上使用適用於Mac的屏幕窗口的像素圖或以任何方式將EPSF(可直接從「Canvas」中獲取)轉換爲具有默認值的像素圖的任何方式Windows PIL/Pillow安裝,這意味着我甚至無法找到手動合成東西的方法......所以我認爲您可能必須在Tk之外繪製圖形和框(使用PIL,GraphicsMagick等),以便您可以複合它們。 – abarnert

1

這也許可以給你一些想法玩:

from tkinter import * 

root = Tk() 
c = Canvas(root, width=640, height=480, bd=0, highlightthickness=0) 
c.create_line(0,240,640,240, fill='blue') 
c.pack() 

#pil image with transparency 
try: 
    from PIL import Image, ImageTk 
except ImportError: 
    pass 
else: 
    pim = Image.new('RGBA', (5,100), (0,255,0,64)) 
    photo = ImageTk.PhotoImage(pim) 
    c.create_image(200,200, image=photo, anchor='nw') 

#blank standard photoimage with red vertical borders 
im = PhotoImage(width=7, height=480) 
dat = ('red',)*480 
im.put(dat, to=(0,0)) 
im.put(dat, to=(6,0)) 

box = c.create_image(0, 0, image=im, anchor='nw') 

def on_motion(event): 
    left,top = c.coords(box) 
    dx = event.x - (left+7) 
    c.move(box, dx, 0) 

c.bind('<Motion>', on_motion) 
root.mainloop() 
0

使用來自PIL庫模塊,您可以創建所需的透明度的圖像。 (RGBA)並將其放入畫布。圖像的透明度應該起作用,至少從我測試過的東西來看。您應該只需要Image和ImageTk模塊。