2017-03-16 61 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,它会产生一个没有装饰的窗口,总是在其他窗口的顶部,但消息框确实出现在其上。