Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter如何将B1运动绑定到组合框_Python_User Interface_Tkinter_Combobox - Fatal编程技术网

Python Tkinter如何将B1运动绑定到组合框

Python Tkinter如何将B1运动绑定到组合框,python,user-interface,tkinter,combobox,Python,User Interface,Tkinter,Combobox,因此,我在一个应用程序中有一个组合框,我要把它放在平板电脑上,这样我就可以拖动组合框,使它向下滚动 到目前为止,我有这个功能: def tablet_drag_y(event): global last_y if event.y_root-last_y>20 or event.y_root-last_y<-20: last_y=event.y_root event.widget.tag_remove(Tk.SEL, "1.0", Tk.

因此,我在一个应用程序中有一个组合框,我要把它放在平板电脑上,这样我就可以拖动组合框,使它向下滚动

到目前为止,我有这个功能:

def tablet_drag_y(event):
    global last_y
    if event.y_root-last_y>20 or event.y_root-last_y<-20:
        last_y=event.y_root
        event.widget.tag_remove(Tk.SEL, "1.0", Tk.END)
        return "break"
    event.widget.yview(Tk.SCROLL,-1*(event.y_root-last_y), "units")
    last_y=event.y_root
    event.widget.tag_remove(Tk.SEL, "1.0", Tk.END)
    return "break"
def平板电脑拖动(事件):
全球最后一年
如果event.y_root-last_y>20或event.y_root-last_y您的问题(和解决方案)与。因此,这里的提示和想法也适用于你的问题

首先,像您描述的这样的功能已经存在:当您在列表的边界上移动时,列表会自动滚动。但是好吧,让我们自己来实现一些东西

首先,我们需要理解combobox什么都不是,只是entry和listbox小部件的组合,我们需要一个部分,那就是listbox(一个弹出窗口)。幸运的是,有一种方法可以让你把它撕下来:

popdown = combobox.tk.eval('ttk::combobox::PopdownWindow %s' % combobox)
之后,当我们的组合框映射时,您可以自由地将某些内容绑定到该小部件:

class CustomBox(ttk.Combobox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.bind('<Map>', self._handle_popdown_bind_on_initialisation)

    def _handle_popdown_bind_on_initialisation(self, *args):
        popdown = self.tk.eval('ttk::combobox::PopdownWindow %s' % self)
        self._bind(('bind', '%s.f.l' % popdown), '<B1-Motion>', <callback_function>, None)
想法很简单:获取一个决策项,即通过列表框的一半,然后根据当前元素的位置决定向上或向下滚动。

class CustomBox(ttk.Combobox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.bind('<Map>', self._handle_popdown_bind_on_initialisation)

    def _handle_popdown_bind_on_initialisation(self, *args):
        popdown = self.tk.eval('ttk::combobox::PopdownWindow %s' % self)
        self._bind(('bind', '%s.f.l' % popdown), '<B1-Motion>', <callback_function>, None)
import tkinter as tk
import tkinter.ttk as ttk
import random
import string


class CustomBox(ttk.Combobox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # schedule bind to handle popdown
        self.bind('<Map>', self._handle_popdown_bind_on_initialisation)

    def _handle_popdown_bind_on_initialisation(self, *args):
        # once combobox is drawn bind callback function
        popdown = self.tk.eval('ttk::combobox::PopdownWindow %s' % self)
        self._bind(('bind', '%s.f.l' % popdown), '<B1-Motion>', drag, None)


def insert_something_to_combobox(box, count=30):
    # just to insert some random stuff
    box['values'] = [gen_key() for _ in range(count)]

def gen_key(size=6, chars=string.ascii_uppercase + string.digits):
    # just to generate some random stuff
    return ''.join(random.choice(chars) for _ in range(size))

def drag(event):
    # test-event for B1-Motion over popdown

    # get index of the nearest item
    nearest_item = root.tk.call(event.widget, 'nearest', event.y)
    # get actual size of listbox
    actual_size = root.tk.call(event.widget, 'size')
    # get current boundary positions for listbox
    current_yview = root.tk.call(event.widget, 'yview')
    # get current boundary items
    current_items = [int(fraction * actual_size) for fraction in current_yview]
    # get decider-item for scrolling
    decider_item = sum(current_items) // 2

    # debug-configure current item
    mouse_over_label.configure(text='B1 over item: %s' % root.tk.call(event.widget, 'get', nearest_item))

    if nearest_item < decider_item:
        # scroll-up
        root.tk.call(event.widget, 'see', current_items[0] - 1)
    elif nearest_item > decider_item:
        # scroll-down
        root.tk.call(event.widget, 'see', current_items[1] + 1)


root = tk.Tk()

mouse_over_label = tk.Label()
mouse_over_label.pack()

combo_box = CustomBox()
combo_box.pack()

insert_something_to_combobox(combo_box)

root.mainloop()