Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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/3/heroku/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 ttk.Combobox下拉/展开并聚焦于文本_Python_Python 3.x_Tkinter_Combobox_Searchbar - Fatal编程技术网

Python tkinter ttk.Combobox下拉/展开并聚焦于文本

Python tkinter ttk.Combobox下拉/展开并聚焦于文本,python,python-3.x,tkinter,combobox,searchbar,Python,Python 3.x,Tkinter,Combobox,Searchbar,我正在尝试使用tkinter中的combobox创建一个搜索栏,我希望当用户键入时,他们可以看到combobox用值展开。我可以展开组合框,但随着组合框值的展开,对组合框条目(文本框)的关注丢失。我还尝试在扩展组合框值后设置textvariable的焦点,但仍然徒劳。 请在不创建类的情况下提供解决方案。 # tkinter modules import tkinter as tk import tkinter.ttk as ttk win=tk.Tk() searchVar = tk.Stri

我正在尝试使用tkinter中的combobox创建一个搜索栏,我希望当用户键入时,他们可以看到combobox用值展开。我可以展开组合框,但随着组合框值的展开,对组合框条目(文本框)的关注丢失。我还尝试在扩展组合框值后设置textvariable的焦点,但仍然徒劳。 请在不创建类的情况下提供解决方案。

# tkinter modules
import tkinter as tk
import tkinter.ttk as ttk

win=tk.Tk()
searchVar = tk.StringVar()
searchVar.trace("w", lambda name, index, mode, searchVar=searchVar:
                    on_searchText_edit())
searchBar=ttk.Combobox(win,values=["1","2","3"],width=50,textvar=searchVar)
searchBar.grid(row=0,column=1,columnspan=2,padx=5,pady=5)

def on_searchText_edit():
    txt=searchBar.focus_get() #searchVar has the focus
    searchBar.event_generate('<Down>')
    txt.focus_set()
#tkinter模块
将tkinter作为tk导入
将tkinter.ttk导入为ttk
win=tk.tk()
searchVar=tk.StringVar()
searchVar.trace(“w”,lambda名称、索引、模式,searchVar=searchVar:
关于搜索文本(编辑())
searchBar=ttk.Combobox(win,值=[“1”、“2”、“3”],宽度=50,textvar=searchVar)
网格(行=0,列=1,列span=2,padx=5,pady=5)
_searchText_edit()上的定义:
txt=searchBar.focus_get()#searchVar具有焦点
searchBar.event_generate(“”)
txt.focus_set()

我相信您需要创建自己的小部件来完成此任务。 您可以使用一个条目小部件和一个列表框来实现这一点。我把一些代码放在一起,向您展示了这个概念。输入区分大小写。代码并不完美,但您可以根据需要对其进行调整

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry('420x200')

        frm = tk.Frame(self)

        self.var = tk.StringVar()

        ent = tk.Entry(frm, textvariable=self.var, fg='black', bg='white')
        lst = tk.Listbox(frm, bd=0, bg='white')

        item_list = ('Big Dog', 'Big Cat', 'big bird', 'Small Bird', 'Small Fish', 'Little Insect', 'Long Snake')

        ent.grid(sticky=tk.EW)
        frm.grid(sticky=tk.NW)

        def get_input(*args):
            lst.delete(0, tk.END)
            string = self.var.get()

            if string:
                for item in item_list:
                    if item.startswith(string):
                        lst.insert(tk.END, item)
                        lst.itemconfigure(tk.END, foreground="black")

                for item in item_list:
                    if item.startswith(string):
                        lst.grid(sticky=tk.NSEW)
                    elif not lst.get(0):
                        lst.grid_remove()
            else:
                lst.grid_remove()

        def list_hide(e=None):
            lst.delete(0, tk.END)
            lst.grid_remove()

        def list_input(_):
            lst.focus()
            lst.select_set(0)

        def list_up(_):
            if not lst.curselection()[0]:
                ent.focus()
                list_hide()

        def get_selection(_):
            value = lst.get(lst.curselection())
            self.var.set(value)
            list_hide()
            ent.focus()
            ent.icursor(tk.END)

        self.var.trace('w', get_input)

        ent.bind('<Down>', list_input)
        ent.bind('<Return>', list_hide)

        lst.bind('<Up>', list_up)
        lst.bind('<Return>', get_selection)


def main():
    app = App()
    app.mainloop()


if __name__ == '__main__':
    main() 
将tkinter作为tk导入
类应用程序(tk.tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
自几何体('420x200')
frm=传统框架(自身)
self.var=tk.StringVar()
ent=tk.Entry(frm,textvariable=self.var,fg='black',bg='white')
lst=tk.Listbox(frm,bd=0,bg='white')
物品清单=(‘大狗’、‘大猫’、‘大鸟’、‘小鸟’、‘小鱼’、‘小虫’、‘长蛇’)
ent.grid(粘性=tk.EW)
frm网格(粘性=tk.NW)
def get_输入(*参数):
第一次删除(0,tk.END)
string=self.var.get()
如果字符串:
对于项目列表中的项目:
如果项.startswith(字符串):
一级插入(tk.结束,项目)
lst.itemconfigure(tk.END,前台=“黑色”)
对于项目列表中的项目:
如果项.startswith(字符串):
第一网格(粘性=tk.NSEW)
elif非第一个获取(0):
第一个网格删除()
其他:
第一个网格删除()
def列表隐藏(e=无):
第一次删除(0,tk.END)
第一个网格删除()
def列表_输入(u):
第一焦点()
一、选择_集(0)
def列表向上(uu):
如果不是lst.curselection()[0]:
ent.focus()
列表隐藏()
def get_选择(u):
value=lst.get(lst.curselection())
self.var.set(值)
列表隐藏()
ent.focus()
耳鼻喉管(tk.END)
self.var.trace('w',获取\u输入)
ent.bind(“”,列表\输入)
ent.bind(“”,列表\隐藏)
一级绑定(“”,上列)
lst.bind(“”,获取所选内容)
def main():
app=app()
app.mainloop()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

您正在寻找的解决方案请提供一个不涉及创建新类的解决方案Shamza:我认为您不可能这样做,因为焦点需要位于当前匹配项的下拉菜单中。你反对创建新类吗?无论如何,这个要求应该在你的问题中说明(即使这是不现实的)。你会建议什么样的弹出菜单小部件?你也可以使用输入小部件和列表框。试着执行我的代码,你就会明白我在寻找什么。