python - 在 Python 3.5 中同时从不同的 Tkinter Listbox 小部件中选择值

标签 python tkinter listbox

我希望我的程序能够以如下方式工作:

  • 当我从 3 个列表框中单击一个元素来选择相邻值时(例如:如果我在第一个列表框中选择 0,则它应该在第二个列表框中选择值“hello”,在第三个列表框中选择值“world”)列表框

感谢This question/answer我设法让它们同时移动

代码如下:

from tkinter import *

class fase3(Frame):

    def __init__(self, master):


        Frame.__init__(self,master)
        self.master=master
        self.frame=Frame(self.master)

        self.txtm=Label(self, text="example")
        self.txtm.grid(row=1, columnspan=5)

        self.txt1=Label(self, text="1")
        self.txt1.grid(row=2, column=1)

        self.txt2=Label(self, text="2")
        self.txt2.grid(row=2,column=2)

        self.txt3=Label(self, text="3")
        self.txt3.grid(row=2,column=3)
        self.scrlb=Scrollbar(self,orient="vertical")

        self.lista1=Listbox(self,yscrollcommand=self.yscroll1,exportselection=0)
        self.lista1.grid(row=3,column=1)

        self.lista2=Listbox(self, yscrollcommand=self.yscroll2,exportselection=0)
        self.lista2.grid(row=3, column=2)

        self.lista3=Listbox(self, yscrollcommand=self.yscroll3,exportselection=0)
        self.lista3.grid(row=3, column=3)

        #self.scrlb.config(command=self.yview)
        #self.scrlb.grid(row=3, column=4,rowspan=1)
#i chose not to place the scrollbar because it involved frames and it makes the code longer


        for i in range(3):
            self.lista1.insert("end",i)

        self.lista2.insert("end","hello")
        self.lista2.insert("end","pls")
        self.lista2.insert("end","thanks")
        self.lista3.insert("end","world")
        self.lista3.insert("end","help")
        self.lista3.insert("end","alot")

    def yscroll1(self, *args):
        if  self.lista2.yview()!=self.lista1.yview()!=self.lista3.yview():
            self.lista2.yview_moveto(args[0])
            self.lista3.yview_moveto(args[0])
        self.scrlb.set(*args)

    def yscroll2(self, *args):
        if  self.lista1.yview()!=self.lista2.yview()!=self.lista1.yview():
            self.lista1.yview_moveto(args[0])
            self.lista3.yview_moveto(args[0])
        self.scrlb.set(*args)

    def yscroll3(self, *args):
        if self.lista2.yview()!=self.lista3.yview()!=self.lista1.yview():
            self.lista1.yview_moveto(args[0])
            self.lista2.yview_moveto(args[0])
        self.scrlb.set(*args)

    def yview(self, *args):
        self.lista1.yview(*args)
        self.lista2.yview(*args)
        self.lista3.yview(*args)



    self.pack()

root = Tk()

marco= Frame(root, padx=100, pady=50)

marco.pack()

lf = fase3(marco)

root.mainloop()

问题的一部分是,我已经有一个绑定(bind)到每个列表框的函数,当我添加 exportselection=0 时,它选择一个值,因此,例如用户可以选择 ("0 ","hello","alot"),对于我的目的来说,这根本没有任何意义(插入数据库)

我没有对此进行任何处理,但是如果它们可以同时移动,那么它们应该可以以某种方式选择相邻的值。

你应该能够复制粘贴这个并在 Python 上运行它,没有问题,我是在 python 3 中制作的。

最佳答案

您要做的第一件事就是绑定(bind)到 <<ListboxSelect>>事件来检测何时在列表框中选择一个选项:

def __init__(self, master):

    # ...

    self.lista1=Listbox(self,yscrollcommand=self.yscroll1,exportselection=0)
    self.lista1.bind('<<ListboxSelect>>', self.on_select1)
    self.lista1.grid(row=3,column=1)

    self.lista2=Listbox(self, yscrollcommand=self.yscroll2,exportselection=0)
    self.lista2.bind('<<ListboxSelect>>', self.on_select2)
    self.lista2.grid(row=3, column=2)

    self.lista3=Listbox(self, yscrollcommand=self.yscroll3,exportselection=0)
    self.lista3.bind('<<ListboxSelect>>', self.on_select3)
    self.lista3.grid(row=3, column=3)

     # ...

选择一个选项后,您想在其他列表框中选择相应的选项:

def on_select1(self, event):
    # Get index of selected option.
    index = self.lista1.curselection()[0]
    # Select corresponding options in other list-boxes.
    self.select_others(index, self.lista2, self.lista3)

def on_select2(self, event):
    # Get index of selected option.
    index = self.lista2.curselection()[0]
    # Select corresponding options in other list-boxes.
    self.select_others(index, self.lista1, self.lista3)

def on_select3(self, event):
    # Get index of selected option.
    index = self.lista3.curselection()[0]
    # Select corresponding options in other list-boxes.
    self.select_others(index, self.lista1, self.lista2)

def select_others(self, index, *others):
    for listbox in others:
        # The list-box's selection must be cleared to prevent the previous selection from remaining.
        listbox.selection_clear(0, listbox.size() - 1)
        listbox.selection_set(index)

最后,self.pack()face3 的末尾类放错位置了。

class face3(Frame):

    # ...

    self.pack()

你应该打包lf相反:

root = Tk()

marco = Frame(root, padx=100, pady=50)
marco.pack()

lf = fase3(marco)
lf.pack()

root.mainloop()

关于python - 在 Python 3.5 中同时从不同的 Tkinter Listbox 小部件中选择值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35164873/

相关文章:

python - rar 文件模块在 python 2.7 中不起作用

Python 3遇到【Decode error - output not utf-8】(sublime text 2)

python - 使用 Tkinter 扫描线程违规

java - 无法从 Internet Explorer 动态 Web 表内的下拉列表中选择值

c# - 当 BindingList 中的现有项目发生更改时,列表框拒绝更新

python - 当收到 `sample_from_datasets` 警告时,TensorFlow 的 `DirectedInterleave selected an exhausted input` 是否仍然从数据集中采样?

python - 如何修复 conda 中的包解析警告?

python - Django:查询多模型中某些属性的现有关系的一对多关系

python - 如何使 ttk.Treeview 的行可编辑?

c# - 从 Controller MVC ASP 4 中的列表框中获取项目