【问题标题】:Tkinter GUI Window BlankTkinter GUI 窗口空白
【发布时间】:2016-01-30 23:25:03
【问题描述】:

我决定尝试编写一个程序,该程序可以根据从体脂测试仪获得的测量值来计算您的体脂百分比。几年前,我为一个朋友创建了一个 Excel 电子表格,这样他就可以计算他的客户的体脂百分比。我认为创建一个程序供他使用会很酷,也可以让我练习一些东西。

当我运行程序时,除了 Tkinter 窗口完全空白之外,它似乎运行没有任何问题。谁能找出我在代码中做错了什么?

另外,如果我得到这个工作,我是否可以创建一个可执行文件给我的好友,或者以某种方式让桌面运行脚本来运行 python 代码?他将使用 Mac,因此已经安装了 python,我认为可能有某种方法可以运行终端脚本,但我不知道该怎么做。

任何帮助将不胜感激,代码如下:

__author__ = 'jared'

import tkinter
import tkinter.messagebox
import cmath

class BodyFatGUI:

 def __init__(self):

    #Create Main Window
    self.main_window = tkinter.Tk()

    #Create Frames for wigets
    self.gender_frame = tkinter.Frame(self.main_window)
    self.tricep_frame = tkinter.Frame(self.main_window)
    self.chest_frame = tkinter.Frame(self.main_window)
    self.abdominal_frame = tkinter.Frame(self.main_window)
    self.suprailiac_frame = tkinter.Frame(self.main_window)
    self.thigh_frame = tkinter.Frame(self.main_window)
    self.button_frame = tkinter.Frame(self.main_window)

    #Initialize Radio Buttons
    self.radio_var = tkinter.IntVar()
    self.radio_var.set(1)

    #Create gender widgets
    self.rb1 = tkinter.Radiobutton(self.gender_frame, text = 'Male', variable=self.radio_var, \
                               value = 1)

    self.rb2 = tkinter.Radiobutton(self.gender_frame, text = 'Female', variable=self.radio_var, \
                               value = 2)

    #Create age widget
    self.age_label = tkinter.Label(self.gender_frame, text='Age:')
    self.age_entry = tkinter.Entry(self.gender_frame, width='7')

    #Create skinfold widgets
    self.tricep_label = tkinter.Label(self.tricep_frame, text='Enter Tricep skinfold measurement:')
    self.tricep_entry = tkinter.Entry(self.tricep_frame, width=10)
    self.chest_label = tkinter.Label(self.chest_frame, text='Enter Chest skinfold measurement:')
    self.chest_entry = tkinter.Entry(self.chest_frame, width=10)
    self.abdominal_label = tkinter.Label(self.abdominal_frame, text = 'Enter Abdominal measurement:')
    self.abdominal_entry = tkinter.Entry(self.abdominal_frame, width=10)
    self.suprailiac_label = tkinter.Label(self.suprailiac_frame, text='Enter Suprailiac measurement:')
    self.suprailiac_entry = tkinter.Entry(self.suprailiac_frame, width=10)
    self.thigh_label = tkinter.Label(self.thigh_frame, text='Enter Thigh measurement:')
    self.thigh_entry = tkinter.Entry(self.thigh_frame, width=10)

    #create button frame
    self.calc_button = tkinter.Button(self.button_frame, text='Calculate', command=self.bodyfat)
    self.quit_button = tkinter.Button(self.button_frame, text='Quit', command=self.main_window.destroy)

    #Pack the widgets
    self.rb1.pack(side='left')
    self.rb2.pack(side='left')
    self.age_label.pack(side='right')
    self.age_label.pack(side='right')
    self.tricep_label.pack(side='left')
    self.tricep_entry.pack(side='left')
    self.chest_label.pack(side='left')
    self.chest_entry.pack(side='left')
    self.abdominal_label.pack(side='left')
    self.abdominal_entry.pack(side='left')
    self.suprailiac_label.pack(side='left')
    self.suprailiac_entry.pack(side='left')
    self.thigh_label.pack(side='left')
    self.thigh_entry.pack(side='left')
    self.calc_button.pack(side='left')
    self.quit_button.pack(side='left')

    tkinter.mainloop()

 def bodyfat(self):
    #Get value entered from user

    tri = float(self.tricep_entry.get())
    chest = float(self.chest_entry.get())
    ab = float(self.abdominal_entry.get())
    sup = float(self.suprailiac_entry.get())
    thigh = float(self.thigh_entry.get())
    age = float(self.age_entry.get())

    sum = tri + chest + ab + sup + thigh

    if self.radio_var.get() is 'Male':

        bd = 1.1093800 - 0.008267*sum + 0.0000016*sum^2 - 0.0001392*age
        fat = ((4.570/bd) - 4.142)*100
        tkinter.messagebox.showinfo('Results', 'Your calculated body fat percentage is: ' + str(fat))

    elif self.radio_var.get() is 'Female':

        bd = 1.0994921 - 0.0009929*sum + 0.0000023*sum^2 - 0.0001392*age
        fat = ((4.570/bd) - 4.142)*100
        tkinter.messagebox.showinfo('Results', 'Your calculated body fat percentage is: ' + str(fat))

body_fat = BodyFatGUI()

【问题讨论】:

  • 你是在terminal/console/cmd.exe中运行看看有没有报错吗?
  • 要为 Mac 创建可执行文件,您必须在 Mac 上创建它。
  • 我在 Mac 上的 PyCharm 上运行它。窗口弹出来,一片空白。有没有更好的办法?
  • PyCharm 应该有 console 窗口,显示错误和由 print() 在脚本中打印的文本。
  • 我检查了代码,没有错误信息。此刻我不知道为什么 tkinter 窗口是空的。

标签: python tkinter


【解决方案1】:

您忘记对所有帧使用pack()

你需要这个来在窗口中放置框架:

self.gender_frame.pack()
self.tricep_frame.pack()
self.chest_frame.pack()
self.abdominal_frame.pack()
self.suprailiac_frame.pack()
self.thigh_frame.pack()
self.button_frame.pack()

【讨论】:

  • 太棒了!谢谢,就是这样!
  • 我现在不得不更改几行。年龄标签出现了,但没有输入空间。我注意到这行代码: self.age_entry = tkinter.Entry(self.gender_frame, width='7') 需要将'7'更改为7,但它仍然没有显示出来。我在您的上述建议中添加了 self.age_frame.pack() 行。还有什么我想念的吗?再次感谢您迄今为止的帮助。编辑:我意识到我不需要打包并创建一个“age_frame”,因为它与“gender_frame”在同一个框架中,这是正确的吗?
  • 找到了。我有两次age_label,我需要一个age_entry。
  • 您能告诉我如何获取单选按钮的值吗?我的 if 和 elif 函数不起作用。我觉得这与获取选定的值有关。
  • 什么错误?顺便说一句:如果您有新问题,请在 SO 上创建新问题
猜你喜欢
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2016-11-27
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多