2015-06-21 47 views
0

背景:我正在嘗試爲構建在Tkinter之上的python編寫一個圖形庫。因此,我想從用戶那裏抽取所有Tkinter的功能,並以類似處理的方式依次修改根窗口的方法調用。例如,我的圖書館(我們稱之爲MYLIB)將使你寫這樣的代碼:關於Tkinter的幾個問題 - 主循環,更新方法,效果等

from mylib import * #this would be my library 
window(400, 400) #open a new window to add objects to 
color('red') #set the color of all subsequent items to red 
circle(radius=5, centerx = 0, centery=0) #make a red circle 
line(10,10, 20, 20) #red line going from (10, 10) to (20, 20) 
color('blue') 
line(50, 50, 100, 100) #blue line 

我覺得像這樣實現它:

try: 
    from tkinter import * 
except: 
    from Tkinter import * 

_root = Tk() 


class MyCanvas(Canvas): 
    def __init__(self, width=400, height=400): 
     master = Toplevel(_root) 
     Canvas.__init__(self, master, width=width, height=height) 
     self.pack() 
     self.items = [] 
     self.width = width 
     self.height = height 
     _root.mainloop() 


global _c 
_c = None 

def window(): 
    _c = MyCanvas() 
    _c.pack() 

def line(a,b,c,d): 
    #config code goes here 
    _c.create_line(a,b,c,d) 

#test 
window() 
line(10, 10, 50, 50) 

這並不工作因爲Python不會走出主循環的(),所以我嘗試這樣做,而不是: 嘗試: 從Tkinter的進口* 除外: 從Tkinter的進口*

_root = Tk() 


class MyCanvas(Canvas): 
    def __init__(self, width=400, height=400): 
     master = Toplevel(_root) 
     Canvas.__init__(self, master, width=width, height=height) 
     self.pack() 
     self.items = [] 
     self.width = width 
     self.height = height 



global _c 
_c = None 

def window(): 
    _c = MyCanvas() 
    _c.pack() 

def line(a,b,c,d): 
    #config code goes here 
    _c.create_line(a,b,c,d) 
    _root.update_idletasks() 

#test 
window() 
line(10, 10, 50, 50) 

但這並沒有起作用 - 它只是凍結。我試圖用update更新update_idletasks。窗戶再次凍結。如何正確使用更新?

有沒有一種方法可以使用mainloop()而不需要用戶明確地調用它?

或者有沒有辦法在主循環中編輯小部件?我想過使用後,但我沒看到這將如何解決問題。

如果沒有答案退出給出這些約束會寫在PyOpenGL的包是有用的或便攜式?我應該從頭開始用C編寫模塊嗎?還有其他的東西嗎?幫我!!!

對不起,長期以來的問題。我已經在這幾個小時了,但無濟於事。

+1

簡短的回答:你需要主循環。 –

+0

如何?更新工作,但只是停止響應。沒有線程和處理callbakcs的方法嗎? –

+0

使用_root.mainloop()作爲腳本的最後一行... –

回答

0

它看起來像我可能會更好地寫這個作爲tcl實現,並使用wish作爲可執行文件。你似乎在做的是定義一個領域特定語言(DSL),你將解釋成驅動Tk的命令。似乎沒有任何特別需要python的地方。

您需要一個主循環。任何窗口應用程序必須有一個事件泵,從系統獲取消息並根據需要將它們分派到窗口。所有這樣的應用程序都必須在主UI線程抽取這個消息隊列的地方結束。在Tk wish可執行文件中,這是內置於解釋器中的。希望您的腳本能夠運行事件循環。您可以通過加載客戶端代碼並將應用程序main函數作爲after事件來模擬python庫。您可能必須確保客戶端代碼不會調用mainloop以避免衝突。

如果你以前從未看過Tcl/Tk--你可能會想。你所定義的東西看起來與Tcl/Tk應用程序的距離並不遙遠。

+0

我是這樣想的。據我所知,他們似乎並沒有使用主循環。相反,他們線程化整個應用程序並使用更新。 http://www.cs.xu.edu/csci170/09f/cs1graphics.py –

+0

甚至Zelle的graphics.py –