当前位置: 首页 > 知识库问答 >
问题:

使用Tkinter在闪烁的光标下方打开一个新窗口

马星阑
2023-03-14

通常我们得到坐标,然后在那里打开一个新窗口。我需要的是在Tkinter文本框闪烁光标的正下方打开一个窗口。我不知道如何根据屏幕中像素的高度和宽度获得那个坐标。

共有1个答案

穆正祥
2023-03-14

您需要获取文本小部件相对于屏幕的当前位置,以及小部件插入光标的边界框,它相对于小部件。

如果文本小部件的某个元素当前不可见,则其边界框为None;在这种情况下,您需要使用滚动文本。请参见使元素可见的方法。

这个程序是为Python2编写的,因此如果在Python3上运行它,需要将import语句更改为import tkinter as tk

#!/usr/bin/env python

''' Text Location Demo
    Open a Tkinter window just under the location of the insertion cursor 
    of a Text widget.

    See http://stackoverflow.com/q/34237313/4014959

    Written by PM 2Ring 2015.12.12
'''

import Tkinter as tk

#Some random text to display in the Text widget
lorem_ipsum = '''Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Aenean lacinia tortor quis quam vehicula semper. Curabitur
faucibus, purus a egestas bibendum, velit metus hendrerit nulla, non
lobortis dolor mi in dolor. Aliquam ultrices felis sit amet dolor
gravida, id ullamcorper odio rutrum. Fusce consectetur tempor nibh, non
dictum dolor dictum nec. In hac habitasse platea dictumst. Morbi laoreet
consequat metus, at lacinia nisl suscipit id. Quisque vitae sodales
velit, a lobortis nisl. Praesent varius convallis efficitur. Vivamus
fringilla at risus nec viverra. Proin suscipit, lorem sed laoreet
ultricies, velit massa ornare nunc, vel egestas nibh ex vitae leo.'''

lorem_ipsum = lorem_ipsum.replace('\n', ' ')

class TextLocationDemo(object):
    ''' Text widget cursor location demo '''
    def __init__(self):
        root = tk.Tk()
        root.title("Text Location Demo")

        tk.Button(root, text="Show cursor location", 
            command=self.location_cb).pack()

        # Create a Text widget, with word wrapping
        self.textwidget = tw = tk.Text(root, wrap=tk.WORD)
        tw.pack()
        tw.insert(tk.END, lorem_ipsum)

        root.mainloop()

    def alert(self, geometry, msg):
        ''' Display `msg` in an Alert with given geometry,
            which is a tuple of (width, height, ox, oy)
        '''
        top = tk.Toplevel()
        # widget geometry parameter must be given in X windows format
        top.geometry("%dx%d%+d%+d" % geometry)

        msg = tk.Message(top, text=msg, width=geometry[0])
        msg.pack()

        button = tk.Button(top, text="Ok", command=top.destroy)
        button.pack()

    def location_cb(self):
        ''' Determine the location of the insertion cursor
            and display it in a window just under that location
        '''
        w = self.textwidget

        # Get the Text widget's current location
        pos_x, pos_y = w.winfo_rootx(), w.winfo_rooty()

        # Get the bounding box of the insertion cursor
        cursor = tk.INSERT
        bbox = w.bbox(cursor)
        if bbox is None:
            print('Cursor is not currently visible. Scrolling...')
            w.see(cursor)
            bbox = w.bbox(cursor)

        bb_x, bb_y, bb_w, bb_h = bbox

        #Open a window just beneath the insertion cursor
        width = 200
        height = 80
        ox = pos_x + bb_x
        oy = pos_y + bb_y + bb_h
        s = 'Cursor: (%d, %d)' % (ox, oy)
        print(s)

        geometry = (width, height, ox, oy)
        self.alert(geometry, s)


TextLocationDemo()

 类似资料:
  • 问题内容: 我有一个文本框,有没有办法隐藏闪烁的文本光标?我之所以这样说,是因为我正在制作一个恐怖/神秘的网站,线索之一就是可以在任何地方开始打字。 也许我可以用JavaScript做到这一点? 问题答案: 尝试这个: 这个想法是在真实的对象上方/上方创建第二个不可见的对象。用户正在键入不可见的内容,但由于不可见,因此文本(也不显示插入符号/光标)不出现!然后,您可以使用JavaScript将其值

  • 有人能帮我理解一下在flink中的窗口(会话)是什么时候和如何发生的吗?或者样品是如何加工的? 例如:假设定义的时间窗口是30秒,如果一个事件在t时间到达,另一个事件在t+30,那么这两个事件都将被处理,但是在t+31到达的事件将被忽略。 如果我说的不对,请纠正。 上面的问题是:如果一个事件在t时间到达,而另一个事件在t+3时间到达,是否还会等待整个30秒来汇总并最终确定结果? DTO: ====

  • 问题内容: 我不知道这有可能吗? 但是我想更改光标闪烁的颜色…通常是黑色的.... 我正在做一个基于java-swing的项目,在那…要求之一就是更改光标闪烁的颜色。 … 这可能吗? 问题答案: “光标”用于指不闪烁的鼠标光标。 因此,我假设您正在谈论文本组件中使用的插入符号: 编辑: 以上建议针对一个文本字段执行此操作。要为所有文本字段更改它,您应该能够在程序开始时使用以下命令:

  • 来源:Kinesis数据流 水槽:弹性搜索 对于使用AWS服务的两者。 此外,在AWS Kinesis数据分析应用程序上运行我的Flink作业 我面临着flink窗口功能的问题。我的工作是这样的 示例事件: 我在这里所做的是从动觉流中,我得到了大量的这些事件,我想对每10秒窗口的视频持续时间求和,然后我想将单个事件存储到elasticsearch中。 在动觉中,每秒可以有10000个事件。我不想在

  • 我怎样才能使背景色在每次按下按钮时连续闪现2个新颜色?现在它只显示两种颜色,但它们不会连续闪烁或闪烁。

  • 我正在更新作为ios 6上传到AppStore的应用程序,以适应IOS 7 SDK,我有一个UIViewController的问题,我看到UIViewController在另一个上面闪烁了一秒钟,然后我可以看到第二个我应该,我添加了这张图片: ViewController中间的橙色来自上一个,它只发生在IOS 7上。推送到下一个视图控制器的代码是:`-(iAction)goButtonPresse