如何将滚动条添加到tinkergui工具?

2024-04-25 21:28:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从这个链接here编写一个简历解析器

我用

git clone https://github.com/John-8704/ResumeFilter.git

然后执行:

python utils/create_training_data.py

这只是打开手动注释数据所需的tinker GUI工具,但它没有滚动条

因此,我编辑了脚本,即其中的create_training_data.py,我用下面的代码修改了resume_gui function,以添加滚动条功能,但即使这样,滚动条也不可见。我如何才能添加滚动条到它

复制, 只需克隆repo并尝试运行python utils/create_training_data.py

def resume_gui(training_data_dir_path, index, file_path, file_content):
    lines_with_dummy_labels = [[line, -1, -1] for line in file_content]

    master = Tk()
    master.columnconfigure(0, weight=1)
    master.rowconfigure(0, weight=1)
    master.geometry("{0}x{1}+0+0".format(master.winfo_screenwidth(), 
                                         master.winfo_screenheight()))
    canvas = Canvas(master, width=170, height=300)
    vsb = Scrollbar(master, orient="vertical", command=canvas.yview)
    canvas.grid(row=0, column=0, sticky=W + E + N + S)
    vsb.grid(row=0, column=1, sticky=N+S)
    gui = LabelResume(master, lines_with_dummy_labels)

    def callback():
        master.destroy()
        output_file_path = os.path.join(training_data_dir_path, str(index)+'.csv')
        if os.path.exists(output_file_path):
            return
        data = pd.DataFrame.from_records(lines_with_dummy_labels,columns=['text',
                                                                  'type','label'])
        rows_to_drop = data.loc[((data['type']== -1) | (data['label'] == -1))].index
        data.drop(data.index[rows_to_drop],inplace = True,axis = 0)
        data.to_csv(output_file_path,index = False)

    canvas.config(yscrollcommand= vsb.set, scrollregion=canvas.bbox("all"))
    master.protocol("WM_DELETE_WINDOW", callback)
    gui.mainloop()

如果有人能帮我,我会非常感激


Tags: pathpymasterdataindexlabelscreatewith
2条回答

为了在代码中使用滚动条,您需要在网页的主要内容周围创建一个单独的框架,因为您使用的是网格格式来布局应用程序

不能在同一帧中使用pack、grid或任何内容。

框架内的所有内容都将使用网格布局来显示,而框架本身将使用pack函数来显示滚动条

frame = Frame(master)
frame.pack(anchor=CENTER) 
# relx/y makes sure it covers
# the whole area of the window.

现在,不要将内容网格化为master,而是将其网格化为框架

scrollbar = Scrollbar(master)
scrollbar.pack( side = RIGHT, fill=Y )

使用上面的代码创建一个滚动条,该滚动条将垂直穿过整个应用程序,其中frame是内容的包装

添加以下更改后,您的代码应该有点像这样:

def resume_gui(training_data_dir_path, index, file_path, file_content):
    lines_with_dummy_labels = [[line, -1, -1] for line in file_content]

    master = Tk()

    master.columnconfigure(0, weight=1)
    master.rowconfigure(0, weight=1)
    master.geometry("{0}x{1}+0+0".format(master.winfo_screenwidth(), 
                                         master.winfo_screenheight()))

    frame = Frame(master)
    frame.pack(anchor=CENTER)

    scrollbar = Scrollbar(master)
    scrollbar.pack( side = RIGHT, fill=Y )

    canvas = Canvas(frame, width=170, height=300)
    canvas.grid(row=0, column=0, sticky=W + E + N + S)

    gui = LabelResume(frame, lines_with_dummy_labels)

    canvas.config(yscrollcommand= vsb.set, scrollregion=canvas.bbox("all"))
    gui.mainloop()

查看LabelResume源代码,它将自己添加到窗口中(参见第31行)。如果您对此进行注释,此行为将停止,然后您可以将框架添加到画布中。然后resume_gui的代码非常相似,但我使用canvas.create_window(0, 0, anchor=N + W, window=gui)LabelResume帧添加到画布,然后确保在使用gui.update()更新画布滚动区域之前呈现它

def resume_gui(training_data_dir_path, index, file_path, file_content):
    lines_with_dummy_labels = [[line, -1, -1] for line in file_content]

    master = Tk()
    master.columnconfigure(0, weight=1)
    master.rowconfigure(0, weight=1)
    master.state('zoomed')
    canvas = Canvas(master, width=170, height=300)
    vsb = Scrollbar(master, orient="vertical", command=canvas.yview)
    canvas.grid(row=0, column=0, sticky=W + E + N + S)
    vsb.grid(row=0, column=1, sticky=N+S)
    gui = LabelResume(master, lines_with_dummy_labels)

    def callback():
        master.destroy()
        output_file_path = os.path.join(training_data_dir_path, str(index)+'.csv')
        if os.path.exists(output_file_path):
            return
        data = pd.DataFrame.from_records(lines_with_dummy_labels,columns = ['text','type','label'])
        rows_to_drop = data.loc[((data['type']== -1) | (data['label'] == -1))].index
        data.drop(data.index[rows_to_drop],inplace = True,axis = 0)
        data.to_csv(output_file_path,index = False)

    canvas.create_window(0, 0, anchor=N + W, window=gui)
    gui.update()
    canvas.config(yscrollcommand= vsb.set, scrollregion=canvas.bbox("all"))
    master.protocol("WM_DELETE_WINDOW", callback)
    gui.mainloop()

相关问题 更多 >