Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter单元转换器_Python_Python 3.x_Tkinter - Fatal编程技术网

Python tkinter单元转换器

Python tkinter单元转换器,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我想在厘米、毫米和公里之间创建一个单位转换器 我希望这些值随着用户在其中一个输入中的键入而不断变化。例如,如果用户开始在厘米字段中键入,我希望在他键入时显示毫米和公里 以下是我到目前为止所做的尝试: 从tkinter导入* def get_选项_值(单位): 如果单位=‘长度’: 长度_frame.pack() 如果单位=‘温度’: 打印(‘温度’) 如果单位=='面积': 打印('区域') 如果单位=‘体积’: 打印('卷') def convert_长度(事件、类型): 如果类型=='m':

我想在厘米、毫米和公里之间创建一个单位转换器

我希望这些值随着用户在其中一个输入中的键入而不断变化。例如,如果用户开始在
厘米字段中键入
,我希望在他键入时显示
毫米
公里

以下是我到目前为止所做的尝试:

从tkinter导入*
def get_选项_值(单位):
如果单位=‘长度’:
长度_frame.pack()
如果单位=‘温度’:
打印(‘温度’)
如果单位=='面积':
打印('区域')
如果单位=‘体积’:
打印('卷')
def convert_长度(事件、类型):
如果类型=='m':
打印('做一些事情')
如果类型=='cm':
打印('做一些事情')
如果类型==“km”:
打印('做一些事情')
window=Tk()
窗口几何体('500x500')
窗口。可调整大小(0,0)
t_框架=框架(窗户,宽度=200,高度=40)
b_框架=框架(窗户,宽度=400,高度=200)
t\u帧。包\u传播(0)
b_帧。包_传播(0)
t_框架组件(padx=30,pady=10)
b_框架组件(ipadx=20,ipady=20)
选项菜单标签=标签(t框架,text=“选择要转换的单位”)
选项菜单标签包()
选项=[“长度”、“温度”、“面积”、“体积”,]
默认值=StringVar()
默认值设置('选择单位')
选项菜单=选项菜单(t帧,默认值,*选项,命令=获取选项值)
选项_menu.pack()
#长度转换器
长度\框架=框架(b\框架,宽度=50,高度=50)
毫米标签=标签(长度帧,text=“毫米”)。网格(行=0)
mm=IntVar()
mm\u entry=entry(长度\u帧,textvariable=mm)
mm_entry.bind(“,lambda事件:转换长度(事件'm'))
厘米标签=标签(长度框架,text=“厘米”)。网格(行=1,列=0)
cm=IntVar()
cm\u entry=entry(长度\u帧,textvariable=cm)
cm_entry.bind(“,lambda事件:转换长度(事件,'cm'))
公里标签=标签(长度帧,text=“公里”)。网格(行=2,列=0)
km=IntVar()
公里数输入=输入(长度帧,文本变量=公里)
km_entry.bind(“,lambda事件:转换长度(事件'k'))
#转换长度按钮=按钮(长度帧,text=“转换长度”,命令=转换长度)
mm_entry.grid(行=0,列=1)
cm_entry.grid(行=1,列=1)
km_条目网格(行=2,列=1)
#转换长度按钮网格(columnspan=2)
#温度转换器
c_标签=标签(b_框架,text=“摄氏度”)
c=StringVar()
c_entry=entry(b_框架,textvariable=c)
window.mainloop()

有人能解释一下我如何编写函数来执行此操作吗?

我重构了您的一些代码,下面是一个解决方案

#validates the input
def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

def convert_length(unit, event=None):

    if unit == 'm':

        val = mm_entry.get()             
        if (is_number(val)):
            mm = float(val)
            cm = mm / 10
            km = mm / 1000000     
            cm_entry.delete(0, END)
            km_entry.delete(0, END)
            cm_entry.insert(0, cm)
            km_entry.insert(0, km)

        else:
            cm_entry.delete(0, END)
            km_entry.delete(0, END)
            if (val == ''):
                cm_entry.insert(0, '')
                km_entry.insert(0, '')
            else:
                cm_entry.insert(0, 'NaN')
                km_entry.insert(0, 'NaN')

mm_label = Label(length_frame, text="Millimeters").grid(row=0)
mm_entry = Entry(length_frame)
mm_entry.bind("<KeyRelease>", lambda value : convert_length('m'))
#验证输入
def是_编号:
尝试:
浮球
返回真值
除值错误外:
返回错误
def convert_长度(单位,事件=无):
如果单位='m':
val=mm_entry.get()
如果(是_编号(val)):
mm=浮动(val)
厘米=毫米/10
km=mm/1000000
cm_条目。删除(0,结束)
km_条目。删除(0,结束)
cm_条目。插入(0,cm)
公里输入。插入(0,公里)
其他:
cm_条目。删除(0,结束)
km_条目。删除(0,结束)
如果(val=''):
cm_条目。插入(0,,)
km_条目。插入(0,,)
其他:
cm_条目。插入(0,'NaN')
km_条目。插入(0,'NaN')
毫米标签=标签(长度帧,text=“毫米”)。网格(行=0)
mm\u入口=入口(长度\u框架)
mm_entry.bind(“,lambda值:convert_length('m'))
对于您试图实现的目标,我建议您对事件处理程序使用
,而不是
。原因是
Entry()
小部件的
insert()
delete()
功能被延迟(是否有相关术语?),如果您使用
,则会为您的输出提供以前输入的计算结果。而
将立即执行这些函数,允许您查看条目小部件中的更改

如果您想查看
的效果,只需切换它们


只需将相同的逻辑和模式应用于剩余的计算单元。

我重构了一些代码,下面是一个解决方案

#validates the input
def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

def convert_length(unit, event=None):

    if unit == 'm':

        val = mm_entry.get()             
        if (is_number(val)):
            mm = float(val)
            cm = mm / 10
            km = mm / 1000000     
            cm_entry.delete(0, END)
            km_entry.delete(0, END)
            cm_entry.insert(0, cm)
            km_entry.insert(0, km)

        else:
            cm_entry.delete(0, END)
            km_entry.delete(0, END)
            if (val == ''):
                cm_entry.insert(0, '')
                km_entry.insert(0, '')
            else:
                cm_entry.insert(0, 'NaN')
                km_entry.insert(0, 'NaN')

mm_label = Label(length_frame, text="Millimeters").grid(row=0)
mm_entry = Entry(length_frame)
mm_entry.bind("<KeyRelease>", lambda value : convert_length('m'))
#验证输入
def是_编号:
尝试:
浮球
返回真值
除值错误外:
返回错误
def convert_长度(单位,事件=无):
如果单位='m':
val=mm_entry.get()
如果(是_编号(val)):
mm=浮动(val)
厘米=毫米/10
km=mm/1000000
cm_条目。删除(0,结束)
km_条目。删除(0,结束)
cm_条目。插入(0,cm)
公里输入。插入(0,公里)
其他:
cm_条目。删除(0,结束)
km_条目。删除(0,结束)
如果(val=''):
cm_条目。插入(0,,)
km_条目。插入(0,,)
其他:
cm_条目。插入(0,'NaN')
km_条目。插入(0,'NaN')
毫米标签=标签(长度帧,text=“毫米”)。网格(行=0)
mm\u入口=入口(长度\u框架)
mm_entry.bind(“,lambda值:convert_length('m'))
对于您试图实现的目标,我建议您对事件处理程序使用
,而不是
。原因是
Entry()
小部件的
insert()
delete()
功能被延迟(是否有相关术语?),如果您使用
,则会为您的输出提供以前输入的计算结果。而
将立即执行这些函数,允许您查看条目小部件中的更改

如果您想查看
的效果