Tkinter Listbox 移动问题

117 阅读2分钟

在 Tkinter (Python 3) 中,用户正在尝试创建一个简单的问卷,但是遇到了一个问题:每当编辑位于列表框下方的标签时,列表框就会发生移动。

huake_00257_.jpg 为了说明这个问题,用户提供了两张图片来展示列表框移动的情况:图片链接

用户希望了解为什么列表框没有保持静止状态,同时提供了相关的代码片段:

class Questionnaire(Frame):
    # GUI

    def __init__(self, master):

        # Initialise

        Frame.__init__(self, master)
        self.grid()
        self.createProgSelect()
        self.createQuestions()

    def createProgSelect(self):

        # Degree programme label

        lblProg = Label(self, text='Degree Programme:', font=('MS', 8, 'bold'))
        lblProg.grid(row=1, column=0, columnspan=2, sticky=NE)

        # Listbox

        self.listProg.configure(yscrollcommand=scroll.set)
        self.listProg = Listbox(self, height=3)
        self.listProg.grid(row=1, column=2, columnspan=2, sticky=E)

        # Scrollbar

        scroll = Scrollbar(self, command=self.listProg.yview)
        scroll.grid(row=1, column=4, sticky=W)

        # Listbox items

        for item in ["CS", "CS with", "BIS", "SE", "Joints", ""]:
            self.listProg.insert(END, item)

        self.listProg.selection_set(END)

    def createQuestions(self):

        # Strongly agree

        lblStrAgr = Label(self, text='Strongly \n Agree', font=('MS', 8, 'bold'))
        lblStrAgr.grid(row=3, column=4, rowspan=2)

        # Partly agree

        lblStrAgr = Label(self, text='Partly \n Agree', font=('MS', 8, 'bold'))
        lblStrAgr.grid(row=3, column=5, rowspan=2)

        # Partly disagree

        lblStrAgr = Label(self, text='Partly \n Disagree', font=('MS', 8, 'bold'))
        lblStrAgr.grid(row=3, column=6, rowspan=2)

        # Strongly disagree

        lblStrAgr = Label(self, text='Strongly \n Disagree', font=('MS', 8, 'bold'))
        lblStrAgr.grid(row=3, column=7, rowspan=2)

        self.varQ1 = IntVar()

        # Label for question 1

        Q1Label = Label(self, text='1. Short text')
        Q1Label.grid(row=5, column=0)

        # Radio buttons for question 1

        R1Q1 = Radiobutton(self, variable=self.varQ1, value=4)
        R1Q1.grid(row=5, column=4)

        R2Q1 = Radiobutton(self, variable=self.varQ1, value=3)
        R2Q1.grid(row=5, column=5)

        R3Q1 = Radiobutton(self, variable=self.varQ1, value=2)
        R3Q1.grid(row=5, column=6)

        R4Q1 = Radiobutton(self, variable=self.varQ1, value=1)
        R4Q1.grid(row=5, column=7)

        Sorry for the slightly stupid question.

2、解决方案

根据提供的代码和描述,问题的原因在于用户创建了一个网格布局。在网格布局中,同一列的所有项目都具有相同的宽度,同一行的所有项目都具有相同的高度。如果某一列的宽度增加,则该列右侧的所有列都会自然地移动以腾出空间。

用户的列表框位于第 3 列,标签位于第 0 列。当用户将标签配置为具有非常宽的文本时,这会导致第 0 列扩展以容纳标签。这将导致所有后续列都向右移动。

一种可能的解决方案是让标签跨越三列(...grid(..., columnspan=3)),但这可能会影响界面的布局和设计。