2017-03-16 63 views
2

我正在嘗試編寫一個程序,允許用戶在全屏Tkinter GUI中按不同的按鈕。這些按鈕預製件的操作對我的問題無關緊要,但我無法創建彈出對話框(askokcancel)來確認用戶想按下按鈕,然後在按下「ok」按鈕時正常運行該按鈕代碼的其餘部分。目前,我有這個計劃從通過/ etc/profile文件啓動運行,通過tkMessageBox從桌面運行時彈出不可見,從啓動運行時可見

sudo的納米/ etc/profile文件訪問

在這裏,我改變目錄到文件夾包含我的Python文件並將它加載我代碼,並在啓動時正確加載我的按鈕,並按下正確的按鈕彈出窗口出現在整個窗口。但是,當我嘗試通過桌面shell運行我的代碼時,一旦按下按鈕,彈出窗口會出現,但隱藏在根窗口後面。我無法點擊其他任何地方,然後按「標籤」和「輸入」允許我在兩個選項之間導航並選擇一個,但無法看到它。我有按鈕在shell中打印單詞,所以我知道彈出窗口實際上在那裏。

全屏使用overrideredirect功能,隱藏任務欄和其他選項。當它設置爲FALSE時,彈出按預期工作,但我試圖使GUI成爲屏幕上唯一的東西。

這裏是我的代碼的精簡版:

from Tkinter import* 
import tkMessageBox 

class Application(Frame): 
    def run(self): 
     tkMessageBox.askokcancel("Run Confirmation!", "Are you sure?") 
     print "RUN Code Intitates" 

    def createWidgets(self): 
     self.button1 = Button(self,height=15,width=20) 
     self.button1["command"] = self.run 
     self.button1.pack({"side": "left"}) 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.createWidgets() 

root = Tk() 
w, h = root.winfo_screenwidth(), root.winfo_screenheight() 
root.overrideredirect(1) 
root.geometry("%dx%d+0+0" % (800, 480)) 

app = Application(master=root) 
app.mainloop() 
root.destroy() 

我絕不是一個計算機科學專業,並只被用樹莓派,Tkinter的,和Python幾個星期的工作,所以如果我我錯過了一些基本的道歉。我用的是我的屏幕爲樹莓派取得8" 觸摸屏

回答

-1

按照tcl/tk documentation

設置覆蓋重定向標誌的窗口,導致其對 窗口管理器忽略;除其他事項外,這意味着 窗口不會從根窗口被重設父成裝飾 幀並且用戶將不能夠使用 正常窗口管理機制

操縱窗口

所以這個窗口並不總是表現出預期的結果(在Windows中情況就不那麼嚴重了)。例如,在Linux中,該窗口沒有獲得鍵盤焦點(python tkinter overrideredirect; cannot receive keystrokes (Linux))。

  • 如果你真正關心的是有一個全屏界面,只需更換

    root.overrideredirect(1)

    通過

    root.attributes('-fullscreen', True)

    ,窗口將正常這樣的消息框將出現在主窗口的頂部。

  • 在Linux的另一種可能性是,以取代

    root.overrideredirect(1)

    通過

    root.attributes('-type', 'dock')

    這告訴窗口管理器處理窗口作爲一個碼頭,並至少在XFCE,它會產生一個沒有裝飾的窗口,總是在其他窗口的頂部,但消息框確實出現在其上。