Поле ввода Tkinter не отображается - PullRequest
1 голос
/ 11 января 2020

Я создаю программу обмена сообщениями, и по какой-то причине мой блок ввода с именем «raw_input» не отображается.

Код:

from tkinter import *
import datetime

def send_message(event):
    #this is a placeholder cuz without it it would give me an error
    q = "hi"
    #delete placeholder then your code here

# *** Initalize Window ***
root = Tk()
root.title("Secure MSG")
root.configure(background='grey')

screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

root.geometry('%sx%s' % (int(screen_width/2), int(screen_height/2)))

# *** Connection Time Chat Box ***
chat_box = Listbox(root, width=screen_width, height=screen_height/2-450)
chat_box.insert(END, 'Connection: ' + str(datetime.datetime.now()))
chat_box.see('end')
chat_box.grid(row=0)

# *** Input Box ***
l1 = Label(root, text="Input:").grid(row=1, sticky=W)

raw_input = Entry(root)
raw_input.grid(row=1, sticky=E)
raw_input.focus()
raw_input.bind('<Return>', send_message)

# *** Run Mainloop ***
root.mainloop()

Любой помощь будет оценена. Спасибо!

1 Ответ

2 голосов
/ 11 января 2020

Причиной вашей проблемы является то, что единицы ширины и высоты для списка отображаются в символах, поэтому вы настраиваете создание списка списка huuuuuuge, который охватывает все остальное под ним. Кроме того, указав геометрию root, вы устанавливаете размер окна * stati c, который недостаточно велик для размещения всех виджетов, которые вы в него поместили. Как правило, лучше просто позволить диспетчеру геометрии обрабатывать подходящие вещи.

Одним из способов будет использование столбцов, чтобы помочь немного, что-то вроде

chatbox.grid(row=0, column=0, columnspan=2, sticky=NSEW)
...
l1 = Label(root, text="Input:")
l1.grid(row=0, column=0, sticky=EW)
grid_column
...
raw_input.grid(row=1, column=1, sticky=EW)
root.columnconfigure(0, weight=0)
root.columnconfigure(1, weight=1)
root.rowconfigure(0, weight=1)

(Примечание: вы в вашем коде присваивается возврат grid () для l1. Это None, и, скорее всего, это вызовет у вас проблемы, вам нужно сначала назначить виджет.)

При изменении значения sticky на EW raw_input будет разверните, чтобы заполнить его ячейку, как и метка. Устанавливая веса для столбцов, они будут корректироваться в зависимости от размера окна, если пользователь его изменяет.

Вы также можете использовать пакет с другим фреймом для виджета ввода и метки. Это немного проще реализовать. Вот ваш код, настроенный для его использования.

from tkinter import *
import datetime

def send_message(event):
    #this is a placeholder cuz without it it would give me an error
    q = "hi"
    #delete placeholder then your code here

# *** Initalize Window ***
root = Tk()
root.title("Secure MSG")
root.configure(background='grey')

# *** Connection Time Chat Box ***
chat_box = Listbox(root)
chat_box.insert(END, 'Connection: ' + str(datetime.datetime.now()))
chat_box.see('end')
chat_box.pack(side=TOP, fill=BOTH, expand=True)
# *** Input Box ***

tempFrame = Frame(root)
tempFrame.pack(side=TOP, fill=X)
l1 = Label(tempFrame, text="Input:", width=5)
l1.pack(fill=X)

raw_input = Entry(tempFrame)
raw_input.pack(fill=X, expand=True)
raw_input.focus()
raw_input.bind('<Return>', send_message)

# *** Run Mainloop ***
root.mainloop()

Это создаст окно, которое настраивается по мере того, как пользователь изменяет его размер.

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