簡體   English   中英

輸入框和標簽未正確對齊Python 2.7 Tkinter

[英]Entry box and label not aligned correctly Python 2.7 Tkinter

我有以下Tkinter應用程序,該應用程序基本上可以幫助您通過在輸入框中插入新值來配置新網絡。 用戶輸入的該值使用模板保存在文件中的某個位置。 該腳本運行良好,但問題是我看到“租戶”輸入框比“網絡名稱”輸入框高。 他們的標簽也是如此。 然后,當我們單擊添加網絡並獲得另一個2輸入框時,將以非常奇怪的方式顯示。

如何對齊標簽+輸入框,如何讓它們分別顯示在標簽+輸入框的每一組中?

就像是:

租戶[入口盒]網絡[入口盒]

租戶[入口盒]網絡[入口盒]

....................................

import Tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.networks = []
        self.switch_frame(StartPage)
    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        start_label = tk.Label(self, text="This is the start page")
        network_button = tk.Button(self, text="Create the networks", command=lambda: master.switch_frame(Networks))
        start_label.pack(side="top", fill="x", pady=10)
        deployment_button.pack()
        network_button.pack()
        subnet_button.pack()
        neutronports_button.pack()
        script_button.pack()

class Networks(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.entries=[]
        self.create_widgets(master)
    def create_widgets(self, master):
        label = tk.Label(self, text="Insert the name of the networks")
        start_button = tk.Button(self, text="Return to start page", command=lambda: master.switch_frame(StartPage))
        new_network_button = tk.Button(self, text="Add network", command=self.add_network)
        new_network_button.bind("<Return>", self.add_network)
        new_network_button.grid(row=len(self.master.networks), column=3, padx=4, pady=6, sticky="W")
        next_button=tk.Button(self, text="Submit", command=self.networks)    
        next_button.grid(row=1500, column=5,padx=4, pady=6, sticky="W")
        label.pack(side="top", fill="x", pady=10)
        start_button.pack()
        new_network_button.pack()
        next_button.pack()
        for index, network in enumerate(self.master.networks):
            self.render_network_field(network, index)

    def add_network(self):
        requirements={'variable': tk.StringVar(self.master), 'cloudvariable': tk.StringVar(self.master)}
        if requirements: 
           self.master.networks.append(requirements)
           self.master.switch_frame(Networks)
        else: 
           tkMessageBox.showerror("tk", "No networks defined!")
           self.master.switch_frame(Networks)

    def render_network_field(self, network, index):
        labelText=tk.StringVar()
        labelText.set("Tenant name")
        labelDir=tk.Label(self,textvariable=labelText, height=4)
        labelDir.pack(side="top")
        nw_entry_field = tk.Entry(self, textvariable=network['variable'])
        nw_entry_field.grid(row=index, column=0, columnspan=2, padx=4, pady=6, sticky="NEWS")
        nw_entry_field.pack(side="right")
        labelText=tk.StringVar()
        labelText.set("Network name")
        labelDir=tk.Label(self,textvariable=labelText, height=4)
        labelDir.pack(side="top")
        cloud_entry_field = tk.Entry(self, textvariable=network['cloudvariable'])
        cloud_entry_field.grid(row=index, column=0, columnspan=2, padx=4, pady=6, sticky="NEWS")
        cloud_entry_field.pack(side="right")
        self.entries.append((network['cloudvariable'],network['variable']))

    def networks(self):
        with open("/home/dante/networks.yml", "w") as f:
             f.write("--- #" + "\n")
             for ent, cloudent in self.entries:
                    network_value=ent.get()
                    cloud_value=cloudent.get()
                    if network_value:
                      if cloud_value:
                        f.write("- { cloud: "+cloud_value+", network: "+network_value+ " }"+ "\n")

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

以下是我為解決您的問題而編寫的簡單代碼。 您只需要將函數register()放在您的類中,當您按下按鈕寄存器(將其放入同一個類中)時便會執行該函數。

import tkinter as tk
from tkinter import *

def register():
    username = x1.get()
    password = y1.get()
    if username!="" and password=="":
    file = open("accountfile.txt","a")
    file.write(username)
    file.write(" ")
    file.write(password)
    file.write("\n")
    file.close()

root=Tk()  

# String variables
x1=StringVar()
y1=StringVar()
Us=Entry(root,textvariable=x1)
Us.grid()
Ps=Entry(root, textvariable=y1)
Ps.grid() 

Reg=Button(root,text="Register",command=lambda:register())
Reg.grid()

root.mainloop()

編輯:

要解決您的錯誤,請創建一個全局變量。 這將為文件中的所有代碼塊定義。 另外,您可以為其設置一個新值,然后在其他任何地方使用該新值

global s
s=""

def networks(self):
    with open("/home/dante/networks.yml", "w") as f:
         f.write("--- #" + "\n")
         f.write("networks:" + "\n")
         for ent in s:
             if ent:
                f.write("- { cloud: cloud1, network: "+str(ent)+ " }"+ "\n")

def render_network_field(self, network, index):
    entry_field = tk.Entry(self, textvariable=network['variable'])
    entry_field.grid(row=index, column=0, columnspan=2, padx=4, pady=6, sticky="NEWS")
    entry_field.pack()

    global s
    s=entry_field.get()

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM