Кнопка и метка не будут центрироваться в Tkinter (Python 3.8) - PullRequest
0 голосов
/ 30 мая 2020

Я пишу интерфейс входа в систему, моя проблема в том, что кнопка входа в систему и две другие метки (к одной из них прикреплено изображение) не центрируются в окне. В этот вопрос я включил ссылку на изображение окна, чтобы вы могли лучше понять, что происходит. Проблема в loginButton, poweredByLabel и gmailLabel. Вот мой код:

emailLabel = Label(contactDeveloperWindow, font = (contactDeveloperFont), text = "Your email:", bg = "#DCDCDC")
emailLabel.grid(row = 1, column = 0, sticky = "w")

emailEntry = Entry(contactDeveloperWindow, font = (contactDeveloperFont), width = 40, borderwidth = 2, relief = "groove")
emailEntry.grid(row = 1, column = 1, columnspan = 3, sticky = "w")
emailEntry.insert(0, "example@gmail.com")

passwordLabel = Label(contactDeveloperWindow, font = (contactDeveloperFont), text = "Password:  ", bg = "#DCDCDC")
passwordLabel.grid(row = 2, column  = 0, sticky = "w")

passwordEntry = Entry(contactDeveloperWindow, font = (contactDeveloperFont), width = 37, borderwidth = 2, relief = "groove", show = "*")
passwordEntry.grid(row = 2, column = 1, sticky = "w")

hidePassword = ImageTk.PhotoImage(Image.open("hide.png"), master = contactDeveloperWindow)
togglePassword = Button(contactDeveloperWindow, image = hidePassword, relief = "groove", bg = "#DCDCDC", command = updatePassword)
togglePassword.image = hidePassword
togglePassword.grid(row = 2, column = 3, sticky = "w")

loginButton = Button(contactDeveloperWindow, font = (contactDeveloperFont), text = "Login", width = 17, padx = 5, pady = 5, relief = "groove", bg = "#DCDCDC")
loginButton.grid(row = 5, column = 0, columnspan = 3)

poweredByLabel = Label(contactDeveloperWindow, font = ('Consolas', 10), text = "powered by", bg = "#DCDCDC")
poweredByLabel.grid(row = 7, column = 0, columnspan = 3)

gmailLogo = ImageTk.PhotoImage(Image.open("powered by.png"), master = contactDeveloperWindow)
gmailLabel = Label(contactDeveloperWindow, image = gmailLogo, bg = "#DCDCDC")
gmailLabel.image = gmailLogo
gmailLabel.grid(row = 8, column = 0, columnspan = 3)

hiddenLabel = Label(contactDeveloperWindow, font = ('Consolas', 1), text = "", bg = "#DCDCDC")
hiddenLabel.grid(row = 0, column = 0, columnspan = 3, sticky = "we")

hiddenLabel = Label(contactDeveloperWindow, font = ('Consolas', 1), text = "", bg = "#DCDCDC")
hiddenLabel.grid(row = 3, column = 0, columnspan = 3, sticky = "we")

hiddenLabel = Label(contactDeveloperWindow, font = ('Consolas', 1), text = "", bg = "#DCDCDC")
hiddenLabel.grid(row = 4, column = 0, columnspan = 3, sticky = "we")

hiddenLabel = Label(contactDeveloperWindow, font = ('Consolas', 1), text = "", bg = "#DCDCDC")
hiddenLabel.grid(row = 6, column = 0, columnspan = 3, sticky = "we")

window image

1 Ответ

3 голосов
/ 30 мая 2020

Я не могу запустить код, поэтому я только предполагаю

Вы должны использовать column=2 вместо column=3 для togglePassword


Если вы хотите сохранить column=3, тогда вам нужно использовать columnspan=4 вместо columnspan=3, потому что у вас будет от column=0 до column=3, что дает 4 столбца.


EDIT: Более сложное изменение - использовать два Frames. Вверху Frame с Entries с grid(). Внизу Frame с кнопкой входа и изображением с использованием pack().

В примере я сохраняю только важные элементы. И я использую pack(pady=...) для создания пробелов между элементами вместо использования пустых меток.

from tkinter import *

contactDeveloperWindow = Tk()

# --- top ---

top_frame = Frame(contactDeveloperWindow)
top_frame.pack(pady=10)

emailLabel = Label(top_frame, text="Your email:")
emailLabel.grid(row=1, column=0)

emailEntry = Entry(top_frame)
emailEntry.grid(row=1, column=1)
emailEntry.insert(0, "example@gmail.com")

passwordLabel = Label(top_frame, text="Password:")
passwordLabel.grid(row=2, column=0, sticky="w")

passwordEntry = Entry(top_frame, show="*")
passwordEntry.grid(row=2, column=1)

togglePassword = Button(top_frame, text="O")
togglePassword.grid(row=2, column=2)

# --- bottom ---

bottom_frame = Frame(contactDeveloperWindow)
bottom_frame.pack()

loginButton = Button(bottom_frame, text="Login")
loginButton.pack(pady=(0,10))

poweredByLabel = Label(bottom_frame, text="powered by")
poweredByLabel.pack(pady=(0,10))

gmailLabel = Label(bottom_frame, text="[place for logo]" )
gmailLabel.pack(pady=(0,10))

contactDeveloperWindow.mainloop()

enter image description here

Вы можете сделать это даже без нижней рамки:

from tkinter import *

contactDeveloperWindow = Tk()

# --- top ---

top_frame = Frame(contactDeveloperWindow)
top_frame.pack(pady=10)

emailLabel = Label(top_frame, text="Your email:")
emailLabel.grid(row=1, column=0)

emailEntry = Entry(top_frame)
emailEntry.grid(row=1, column=1)
emailEntry.insert(0, "example@gmail.com")

passwordLabel = Label(top_frame, text="Password:")
passwordLabel.grid(row=2, column=0, sticky="w")

passwordEntry = Entry(top_frame, show="*")
passwordEntry.grid(row=2, column=1)

togglePassword = Button(top_frame, text="O")
togglePassword.grid(row=2, column=2)

# --- bottom ---

loginButton = Button(contactDeveloperWindow, text="Login")
loginButton.pack(pady=(0,10))

poweredByLabel = Label(contactDeveloperWindow, text="powered by")
poweredByLabel.pack(pady=(0,10))

gmailLabel = Label(contactDeveloperWindow, text="[place for logo]" )
gmailLabel.pack(pady=(0,10))

contactDeveloperWindow.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...