当前位置: 首页 > 面试题库 >

如何将Tkinter destroy()绑定到Debian中的键?

施令雪
2023-03-14
问题内容

以下代码在MS Windows中正常工作(按时脚本将退出q):

import Tkinter as tk

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry("{0}x{1}+0+0".format(
            self.root.winfo_screenwidth(), self.root.winfo_screenheight())
        )
        self.root.overrideredirect(True)
        tk.Label(text="some text here").grid()
        self.root.bind('q', self.appexit)
        self.root.mainloop()

    def appexit(self, event):
        self.root.destroy()

App()

我试图在“无窗口管理器”的Debian环境中运行它(引导至控制台,运行startx,它通过.xinitrc(那里唯一的命令)启动脚本)。

该脚本按预期方式启动,但按q任何操作均不执行任何操作(我原本希望X关闭并返回至文本控制台)。后来我尝试添加,以防万一self.root.focus()mainloop()但这并没有帮助。

MS Windows和Debian环境之间这种不同行为的原因可能是什么?


问题答案:

使用overrideredirect程序会失去与窗口管理的联系,因此似乎无法获得有关按键的信息,甚至无法获得焦点。

MS Windows是一个大的窗口管理器,因此似乎overrideredirect无法在该系统上运行。

也许您可以self.root.attributes('-fullscreen', True)代替self.root.overrideredirect(True)

顺便说一句:我用于测试self.root.after(5000, self.root.destroy)-在无法控制5秒后杀死窗口。

编辑:

一些(有效的)示例fullscreen

overrideredirect在Linux上使用时,程序可以获取键盘事件,因此绑定不起作用,并且您无法集中注意力Entry()。但是鼠标和Button()作品。overrideredirect适用于带或不带按钮的“启动画面”。

import Tkinter as tk

class App():
    def __init__(self):
        self.root = tk.Tk()

        # this works

        self.root.attributes('-fullscreen', True)

        # this doesn't work

        #self.root.overrideredirect(True)
        #self.root.geometry("800x600+100+100") # to see console behind
        #self.root.after(5000, self.appexit) # to kill program after 5s

        self.root.bind('q', self.q_pressed)

        tk.Label(text="some text here").grid()
        e = tk.Entry(self.root)
        e.grid()
        e.focus() # focus doesn't work with overrideredirect

        tk.Button(self.root, text='Quit', command=self.appexit).grid()

        self.root.mainloop()

    def q_pressed(self, event):
        print "q_pressed"
        self.root.destroy()

    def appexit(self):
        print "appexit"
        self.root.destroy()

App()


 类似资料:
  • 问题内容: 我有一个JList和ArrayList。如何将arraylist中的数据绑定到jlist.Ares有替代方法吗? 如何绑定以上代码。现在代码给出错误。 问题答案: 您无需克隆ArrayList。只需调用toArray()

  • 问题内容: 我目前正在使用 属性启动Java VM,以便可以通过JConsole连接到Java VM 进行管理和监视。不幸的是,它监听计算机上的所有接口(IP地址)。 在我们的环境中,通常情况下,一台机器上同时运行多个Java VM。尽管可以告诉JMX侦听不同的TCP端口(使用),但是最好让JMX使用标准的JMX端口并仅绑定到特定的IP地址(而不是所有IP地址)。 这将使查找通过JConsole连

  • 问题内容: 编程新手,尤其是python和tKinter。如何创建将键“s”绑定到按钮或功能的方法?任何帮助都是极好的。 问题答案: 您需要进行两项更改: 加 到。(绑定到Frame似乎无效。) 当按下时,会被调用。由于Tkinter将发送对象,因此我们还必须将呼叫签名更改为 因此,当按下按钮时,将被设置为默认值,但是当按下按键时, 将被分配给对象。

  • 问题内容: 我只是想知道在Tkinter中是否可以将click事件绑定到画布。 我希望能够在画布上单击任意位置,然后将一个对象移到画布上。我能够提出议案,但是我还没有找到在画布上绑定click事件的方法。 问题答案: 直接取自Effbot关于事件的教程中的示例。 在此示例中,我们使用框架小部件的bind方法将回调函数绑定到名为的事件。运行该程序,然后在出现的窗口中单击。每次单击,都会在控制台窗口中

  • 问题内容: 我需要将 DataTable 绑定到 DataGridView 。我这样做: 但我得到的是 数据表中 增加了新的 列到我 的DataGridView 。我不需要这个,我只需要在现有列下编写即可。 拜托,帮帮我,伙计们! 问题答案: 尝试这个: 如果您不想清除所有现有的列,则必须为每个现有的列进行设置,如下所示:

  • 有没有一种方法可以直接将memcached绑定到它下面的本地存储?将用一个例子来解释。假设hbase被用作分布式的后端。memcached的一层被用作缓存层,它可以被认为是hbase的一个完全副本(在某种意义上)。假设系统中有4个节点,其中3个用于hbase并在其顶部有一个memcached层,1个节点用于计算。通常的规范是查找memcached是否有某个键。如果有,取出来并用于计算。如果没有,则