Tkinter Entry.insert()将类型从int改为str



我需要做一个简单的gui来接受用户输入以进行进一步处理。这是我第一次使用tkinter,我遇到了一个奇怪的问题。即Entry.insert()将类型从int更改为str。此外,首先它工作正常,但后来我试图实现一些东西,我做了几个强大的ctrl + z,现在我无法修复它。下面是我的代码:

from tkinter import *
from tkinter import messagebox
from dataclasses import make_dataclass

def build_gui():
def check_for_correct_input():
for name, value in list(entries.items())[:-1]:
if value.get().isdigit():
messagebox.showwarning(
title='Entered wrong data',
message=f'Field "{name}" accepts only letters.nInstead: "{value.get()}" was provided',
)
return False
elif len(value.get()) == 0:
messagebox.showwarning(
title='Input not provided.',
message='Please provide needed input.',
)
return False
for name, value in list(entries.items())[-1:]:
print(value.get())
print(type(value.get()))
if not isinstance(value.get(), int):
messagebox.showwarning(
title='Entered wrong data.',
message=f'Field "{name}" accepts only integers.nInstead: "{value.get()}" was provided',
)
return False
elif len(value.get()) == 0:
messagebox.showwarning(
title='Input not provided.',
message='Please provide needed input.',
)
return False
return True
# saves values to config file
def store_values():
if check_for_correct_input():
for name, entry in entries.items():
entries[name] = entry.get()
messagebox.showinfo(
title='Valid data provided.',
message='Program will start working now.',
)
root.destroy()
return True
messagebox.showerror(
title='Invalid input data.',
message=f'Please provide valid input.',
)
# clears all entries
def clear_entries():
for entry in entries.values():
entry.delete(0, END)
root = Tk()
root.title('Config for wohoho.py')
root.geometry('1000x400')
# Heading
Label(root, text='Enter needed data:', font='comicsansms 13 bold', pady=15).grid(row=0, column=3)
# Text for our form
labels = {
'xlsx_file_name': Label(root, text='xlsx_file_name  ', font='comicsansms 12',),
'URLs_column': Label(root, text="URLs_column  ", font='comicsansms 12',),
'views_column': Label(root, text='views_column  ', font='comicsansms 12',),
'date_column': Label(root, text='date_column  ', font='comicsansms 12',),
'starting_row': Label(root, text='starting_row  ', font='comicsansms 12',),
}
# Pack text for our form
row = 1
for label in labels.values():
label.grid(row=row, column=2, sticky=E)
row += 1
# Tkinter variable for storing entries
LabelAttributes = make_dataclass(
'LabelAttributes', ['value', 'label_name',]
)
labels_values = {
'xlsx_file_name_value': LabelAttributes(
value='.xlsx path', label_name='xlsx_file_name',
),
'URLs_column_value': LabelAttributes(
value='L', label_name='URLs_column_value',
),
'views_column_value': LabelAttributes(
value='B', label_name='views_column_value',
),
'date_column_value': LabelAttributes(
value='D', label_name='date_column_value',
),
'starting_row_value': LabelAttributes(
value=4, label_name='starting_row_value',
),
}
entries = {}
row = 1
for value in labels_values.values():
entries[value.label_name] = Entry(root, width=100)
entries[value.label_name].grid(row=row, column=3)
entries[value.label_name].insert(0, value.value)
row += 1
# Button & packing it and assigning it a command
Button(
text='Clear',
command=clear_entries,
height=2,
width=10,
font='comicsansms 12 bold',
bd=3,
).grid(row=7, column=3
)
Button(
text='Accept',
command=store_values,
height=2,
width=10,
font='comicsansms 12 bold',
bd=3,
).grid(row=8, column=3
)
root.mainloop()
build_gui()

如下片段所示:

starting_row_value': LabelAttributes(value=4)

我将starting_row_value设置为4,尽管然后它去验证check_for_correct_input(),它的类型从int变为str。我不知道为什么会发生。

我也认为我的代码是混乱的。如果有人愿意重构它,我会很感激。基本上我想:

  1. 从用户获取输入(在我的代码中有预先输入的建议)
  2. 验证输入是否正确。如果正确->如果不再次请求输入,则将其存储在dict/yaml或其他文件中。我还试图实现while循环,如果它被关闭并且输入未存储,则重新运行tkinter gui,但我失败了:(.

任何帮助都将是非常感激的,因为我已经浪费了4个小时,我还在原地。

致以最亲切的问候!

即Entry.insert()将类型从int改为str…它的类型从int变成了str,我不知道为什么会发生这种情况。

是的,这就是Entry小部件一直工作的方式。get方法总是返回一个字符串,而insert方法在将数据插入小部件之前将所有非字符串参数转换为字符串。您可以将数据转换为您想要的类型。

get的比较合适的文档是"返回文本。">,规范的tcl/tk文档同样简单:"返回条目的字符串。">

而且首先它工作正常

我不明白你那是什么意思。在条目小部件上调用get总是返回一个字符串。

最新更新