繁体   English   中英

用 tkinter 单击时是否可以调整输入框(条目)的大小?

[英]Is it possible to resize an input box (entry) when clicked with tkinter?

阅读其他 stackoverflow 问题和其他来源,我确实看到 bind 可用于调用 function。目前我正在开发一个将与数据库(很可能是 mongodb)通信的程序,到目前为止我已经设置好了每行有 2 个输入(键值)的帧。 我还没有完全决定是每个文档一行,还是每个字段一行。 现在,如果用户要输入很多内容,那么这对他们来说就不是理想的选择,因为您看不到您输入的所有内容。 所以我的想法是,如果用户单击条目小部件,那么框会变大并向他们显示他们所写的所有内容。 我目前的想法是,也许我可以为它创建另一个框架并以某种方式将信息传递给它?

这是它目前的样子

那么我理想中希望它看起来像什么

如果对我是如何制作它感兴趣的话,这里是代码(图片来自“CreatePage”部分):

from tkinter import *
import tkinter as tk
 
class Database_Project(tk.Tk):
 
    def __init__(self):
        tk.Tk.__init__(self)
        
        stack_frame_container = tk.Frame(self)
        stack_frame_container.grid_columnconfigure(0, weight=1)
        stack_frame_container.grid_rowconfigure(0, weight=1)
        stack_frame_container.pack(side="top", fill="both", expand=True)
 
        self.frameslist = {}
 
        for frame in (MainPage, CreatePage):
            frame_occurrence = frame.__name__
            active_frame = frame(parent=stack_frame_container, controller=self)
            self.frameslist[frame_occurrence] = active_frame
            active_frame.grid(row=0, column=0, sticky="snew")
 
        self.current_frame("MainPage")
            
    def current_frame(self, frame_occurrence):
        active_frame = self.frameslist[frame_occurrence]
        active_frame.tkraise()
 
class MainPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
 
        label_create = tk.Label(self, text="Create and insert data").grid(row=0, column=0, padx=50, pady=(50,0))
        create_button = tk.Button(self, text="CREATE", command=lambda: controller.current_frame("CreatePage")).grid(row=1, column=0)
 
        label_read = tk.Label(self, text="Query over data").grid(row=0, column=1, padx=50, pady=(50,0))
        read_button = tk.Button(self, text="READ").grid(row=1, column=1)
 
        label_update = tk.Label(self, text="Modify existing data").grid(row=2, column=0, padx=50, pady=(50,0))
        update_button = tk.Button(self, text="UPDATE").grid(row=3, column=0, pady=(0,50))
 
        label_delete = tk.Label(self, text="Remove data").grid(row=2, column=1, padx=50, pady=(50,0))
        delete_button = tk.Button(self, text="DELETE").grid(row=3, column=1, pady=(0,50))
 
class CreatePage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
 
        self.inputlist = []
        self.newinputlist = []
 
        labels = [tk.Label(self, text="Enter unique field"), tk.Label(self, text="Enter corresponding the value/s")]
        self.inputlist.append(labels[:])
 
        for toplabels in range(1):
            self.inputlist[toplabels][0].grid(row=toplabels, column=0, padx=10, pady=5)
            self.inputlist[toplabels][1].grid(row=toplabels, column=1, padx=10, pady=5)
 
        for entries in range(2):
            for entrynum in range(0, 1):
                print("column:", entries)
                print("row", entrynum)
 
                self.newinputlist.append(tk.Entry(self, borderwidth=5))
 
        for x in range(len(self.newinputlist)):
            self.newinputlist[x].grid(row=1, column=x, padx=10, pady=5)
 
        self.inputlist.append(self.newinputlist[:])
 
        button_input_1 = [tk.Button(self, text="ADD FIELD/VALUE", command=self.add_insert), tk.Button(self, text="BACK", command=lambda: controller.current_frame("MainPage"))]
        self.inputlist.append(button_input_1[:])
        button_input_2 = [tk.Button(self, text="IMPORT FILE"), tk.Button(self, text="SUBMIT DATA")]
        self.inputlist.append(button_input_2[:])
        
        for button in range(len(self.inputlist) - 2, len(self.inputlist)):
            self.inputlist[button][0].grid(row=button, column=0, padx=10, pady=5)
            self.inputlist[button][1].grid(row=button, column=1, padx=10, pady=5)
 
    def add_insert(self):
 
        add_input = [tk.Entry(self, borderwidth=5), tk.Entry(self, borderwidth=5)]
        self.inputlist.insert(-2, add_input)
        self.newinputlist.append(add_input)
        
        for widget in self.children.values():
            widget.grid_forget()
 
        for index, widgets in enumerate(self.inputlist):
            widget_one = widgets[0]
            widget_two = widgets[1]
 
            print(str(index), widget_one, widget_two)
            widget_one.grid(row=index, column=0, padx=10, pady=5)
            widget_two.grid(row=index, column=1, padx=10)
        
 
if __name__ == "__main__":
    NoSQL_Project = Database_Project()
    NoSQL_Project.title("NoSQL Database Project")
    NoSQL_Project.mainloop()

调整Entry小部件的大小毫无意义,因为它们只能容纳一行。 我将给出一个使用Text小部件的示例,尽管该技术适用于任何小部件。

真的没有技巧,只需绑定到<FocusIn><FocusOut> 在下面的示例中,我创建了两个具有这种调整大小行为的Text小部件:

import tkinter as tk

def resizer(event):
    if event.widget == event.widget.focus_get():
        event.widget.configure(height=8)
    else:
        event.widget.configure(height=1)

root = tk.Tk()
root.geometry("400x200")

text1 = tk.Text(root, height=1, width=20)
text2 = tk.Text(root, height=1, width=20)

text1.pack(side="left")
text2.pack(side="right")

for widget in (text1, text2):
    widget.bind("<FocusIn>", resizer)
    widget.bind("<FocusOut>", resizer)

root.mainloop()

屏幕截图,左侧小部件具有焦点屏幕截图,右侧小部件具有焦点

实际行为取决于您如何布置小部件。 这可能会导致小部件跳来跳去或 window 调整大小,但每个应用程序都会不同,因此很难提供适用于所有地方的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM