Как сделать так, чтобы tkinter.Entry распространялся на правую часть окна? - PullRequest
0 голосов
/ 09 октября 2019

Я создаю игру-криптограмму с использованием tkinter в python 3, которая принимает название, фразу, количество букв раздачи и сами буквы раздачи в качестве входных данных.

В настоящее время окно выглядит так: Окно ввода tkinter

Проблема в том, что я хочу, чтобы белые поля ввода начинались с конца метки слева и расширялись до конца окна.

Вот так: желаемый дизайн окна ввода

В настоящее время я использую метод .pack() для размещения объектов в окне со строками и столбцами.

InВсего имеется 4 строки и два столбца:

строка1: titleLabel, titleEntry

строка2: фразаLabel, фразаEntry

строка3: numGiveawayLettersLabel, numGiveawayLettersEntry

row4: giveawayLettersLabel, (не уверен, что это будет еще, но это займет в бесплатных письмах)

Вот мой код:

global windowBackgroundColour
windowBackgroundColour = "#5A9AD7"

def createUserInputsWindow():
    global userInputsWindow
    global windowBackgroundColour
    # specifies what global variables tihs method is using

    # -------------------- Creates User Inputs Window --------------------

    userInputsWindow = tkinter.Tk()
    userInputsWindow.configure(bg=windowBackgroundColour)
    userInputsWindow.title("The Puzzle Club")

    # -------------------- Creates Frames (Containers) --------------------

    userInputsWindowRow1 = tkinter.Frame(userInputsWindow)
    userInputsWindowRow1Column1 = tkinter.Frame(userInputsWindowRow1)
    userInputsWindowRow1Column2 = tkinter.Frame(userInputsWindowRow1)

    userInputsWindowRow2 = tkinter.Frame(userInputsWindow)
    userInputsWindowRow2Column1 = tkinter.Frame(userInputsWindowRow2)
    userInputsWindowRow2Column2 = tkinter.Frame(userInputsWindowRow2)

    userInputsWindowRow3 = tkinter.Frame(userInputsWindow)
    userInputsWindowRow3Column1 = tkinter.Frame(userInputsWindowRow3)
    userInputsWindowRow3Column2 = tkinter.Frame(userInputsWindowRow3)

    userInputsWindowRow4 = tkinter.Frame(userInputsWindow)
    userInputsWindowRow4Column1 = tkinter.Frame(userInputsWindowRow4)
    userInputsWindowRow4Column2 = tkinter.Frame(userInputsWindowRow4)

    # -------------------- Populating Frames (Containers) --------------------

    userInputsWindowRow1.pack(side="top", fill="both")
    userInputsWindowRow1Column1.pack(side="left", fill="both")
    userInputsWindowRow1Column2.pack(side="right", fill="both")

    userInputsWindowRow2.pack(side="top", fill="both")
    userInputsWindowRow2Column1.pack(side="left", fill="both")
    userInputsWindowRow2Column2.pack(side="right", fill="both")

    userInputsWindowRow3.pack(side="top", fill="both")
    userInputsWindowRow3Column1.pack(side="left", fill="both")
    userInputsWindowRow3Column2.pack(side="right", fill="both")

    userInputsWindowRow4.pack(side="top", fill="both")
    userInputsWindowRow4Column1.pack(side="left", fill="both")
    userInputsWindowRow4Column2.pack(side="right", fill="both")

    userInputsWindowRow1.configure(bg=userInputsWindow.cget("bg"))
    userInputsWindowRow2.configure(bg=userInputsWindow.cget("bg"))
    userInputsWindowRow3.configure(bg=userInputsWindow.cget("bg"))
    userInputsWindowRow4.configure(bg=userInputsWindow.cget("bg"))

    userInputsWindow.resizable(width=False, height=False)



    # -------------------- Creating Widgets --------------------

    titleLabel = tkinter.Label(userInputsWindowRow1Column1, text="Title:")
    titleLabel.configure(fg="black", bg=userInputsWindowRow1.cget("bg"), font="none 32")
    # This creates a title label, that has the text - "Title:"

    phraseLabel = tkinter.Label(userInputsWindowRow2Column1, text="Phrase:")
    phraseLabel.configure(fg="black", bg=userInputsWindowRow2.cget("bg"), font="none 32")
    # This crates a phrase label, that has the text - "Phrase:"

    numGiveawayLettersLabel = tkinter.Label(userInputsWindowRow3Column1, text="# of Giveaway Letters:")
    numGiveawayLettersLabel.configure(fg="black", bg=userInputsWindowRow3.cget("bg"), font="none 32")
    # This creates a label that has the text - "# of Giveaway Letters:"

    giveawayLettersLabel = tkinter.Label(userInputsWindowRow4Column1, text="Giveaway Letters:")
    giveawayLettersLabel.configure(fg="black", bg=userInputsWindowRow4.cget("bg"), font="none 32")
    # This creates a label that has the text - "Giveaway Letters:"

    titleEntry = tkinter.Entry(userInputsWindowRow1Column2, font=titleLabel.cget("font"))
    titleEntry.insert(0, "Enter title")
    # This creates an entry box for the user to enter the title of their puzzle in

    phraseEntry = tkinter.Entry(userInputsWindowRow2Column2, font=phraseLabel.cget("font"))
    phraseEntry.insert(0, "Enter Phrase")
    # This creates an entry box for the user to enter the phrase they wish to use in the puzzle

    numGiveawayLettersEntry = tkinter.Entry(userInputsWindowRow3Column2, font=numGiveawayLettersLabel.cget("font"))
    numGiveawayLettersEntry.insert(0, "(1 - 26)")
    # This creates an entry box for the user to enter how many giveaway letters they wish to have

    # -------------------- Populating Widgets --------------------

    titleLabel.pack(side="left", fill="both")
    phraseLabel.pack(side="left", fill="both")
    numGiveawayLettersLabel.pack(side="left", fill="both")
    giveawayLettersLabel.pack(side="left", fill="both")

    titleEntry.pack(side="left", fill="both", expand=True)
    phraseEntry.pack(side="left", fill="both", expand=True)
    numGiveawayLettersEntry.pack(side="left", fill="both", expand=True)

    return

Помощь будет высоко ценится, спасибо!

(В моем коде много функций, и на некоторые глобальные переменные, возможно, не ссылались в коде выше, если вам нужен полный код, пожалуйста, сообщите мне)

1 Ответ

0 голосов
/ 09 октября 2019

Самый простой способ сделать это - использовать один кадр на строку. Вы уже делаете это, но намного проще, если вы используете функцию или класс. Единственное, чего вам не хватает - вам нужно использовать опцию fill как для каждой записи, так и для каждого кадра.

Пример использования класса:

class InputRow(tkinter.Frame):
    def __init__(self, master, text, help_text):
        tkinter.Frame.__init__(self, master, background=master.cget("background"))
        self.label = tkinter.Label(self, text=text, background=master.cget("background"))
        self.entry = tkinter.Entry(self)
        self.label.pack(side="left")
        self.entry.pack(side="left", fill="x", expand=True)
        self.entry.insert(0, help_text)

    def get(self):
        return self.entry.get()

Затем можно создать метки и записи, например:

rows = [
    InputRow(userInputsWindow, "Title:", "Enter title"),
    InputRow(userInputsWindow, "Phrase:", "Enter Phrase"),
    InputRow(userInputsWindow, "# of Giveaway Letters:", "(1-26)"),
    InputRow(userInputsWindow, "Giveaway Letters:", ""),
]

for row in rows:
    row.pack(side="top", fill="x")
...