【问题标题】:Creating a temperature program using Python and Tkinter使用 Python 和 Tkinter 创建温度程序
【发布时间】:2012-10-29 03:06:30
【问题描述】:

我正在为每年的温度编写一个小型 Python/Tkinter 程序。

我可以让几乎所有东西都作为文本程序运行,但我想将它实现到 GUI 中。

程序打开一个csv 文件,将其读入列表,计算出平均值以及最小和最大温度。然后,在关闭时,应用程序会将摘要保存到新的文本文件中。

我希望默认启动屏幕显示所有年份。当一个按钮被点击时,它只显示当年的数据。

这是我想要的样子:

非常简单的布局,只有 5 个按钮和每个按钮的输出。

我可以用以下方法组成顶部的按钮:

class App:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.hi_there = Button(frame, text="All Years", command=self.All)
        self.hi_there.pack(side=LEFT)

        self.hi_there = Button(frame, text="2011", command=self.Y1)
        self.hi_there.pack(side=LEFT)

        self.hi_there = Button(frame, text="2012", command=self.Y2)
        self.hi_there.pack(side=LEFT)

        self.hi_there = Button(frame, text="2013", command=self.Y3)
        self.hi_there.pack(side=LEFT)

        self.hi_there = Button(frame, text="Save & Exit", command=self.Exit)
        self.hi_there.pack(side=LEFT)

我不知道如何处理其他元素,例如标题和表格。

一旦我有了结构/框架,我想我可以填充这些字段,这样我可能会学得更好。

【问题讨论】:

  • 基本上你需要制作一个Text 小部件并调用它的insert 方法来添加文本字符串。我建议你找一个tkinter 教程或一本关于使用它的书。为了让您开始,这里有一个 reference guide 和其他标题为 Thinking in Tkinter 的东西。
  • 这是我刚刚发现的另一个好资源,名为Tkinter Wiki

标签: python user-interface button tkinter output


【解决方案1】:

您好,我想我理解您要完成的工作,我建议使用 ttk.Treeview 来制作表格,它是一个非常有用的工具,虽然它可能看起来很难工作

这里有一个小例子可以帮助你理解我的意思

from Tkinter import *
import ttk

class App:
    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.hi_there = Button(frame, text="All Years", command=self.All)
        self.hi_there.pack(side=LEFT)

        self.hi_there = Button(frame, text="2011", command=self.Y1)
        self.hi_there.pack(side=LEFT)

        self.hi_there = Button(frame, text="2012", command=self.Y2)
        self.hi_there.pack(side=LEFT)

        self.hi_there = Button(frame, text="2013", command=self.Y3)
        self.hi_there.pack(side=LEFT)

        self.hi_there = Button(frame, text="Save & Exit", command=self.Exit)
        self.hi_there.pack(side=LEFT)

        frame2 = Frame(master)
        frame2.pack()
        treedata = [('column 1', 'column 2'), ('column 1', 'column 2')]
        column_names = ("heading1", "heading2")
        tree = ttk.Treeview(frame2, columns = column_names)

        for x in treedata:
            tree.insert('', 'end', values =x)
        for col in column_names: 
            tree.heading(col, text = col.Title())
        tree.pack()

希望这会有所帮助,这方面的文档不多,但谷歌会提供帮助,一个非常有用的链接:http://www.tkdocs.com/tutorial/tree.html

祝你好运:)

如果您需要更多帮助,请在评论中提问 :)

【讨论】:

  • 显然只是为标题添加了一个来自 tk 的标签,忘记了:P
  • 嘿,谢谢。我已经尝试过了,但迷路了>
【解决方案2】:

您可能要考虑的一个选项是使用 .grid() 函数,而不是使用 tkinter 的 .pack() 函数。这使您可以更动态地将对象排列成您想要的方式,并且非常适合您正在做的事情(创建网格)。

完成此操作后,您可以获取 csv 文件信息并将文本保存为变量(假设为 csvText)。然后,使用以下命令将变量打印为标签:

dataText = Tkinter.Label(root,text=csvText)
dataText.grid(row=2,column=0)

并为每条信息执行此操作。除了使用columnspan 属性之外,顶部的标题将以相同的方式打包到网格中:

title = Tkinter.Label(root,text="TITLE")
title.grid(row=1,column=0,columnspan=4)

您的按钮将是相同的,除了不使用.pack(side=LEFT),您可以通过以下方式打包它们:

self.hi_there = Button(frame, text="All Years", command=self.All)
self.hi_there.grid(row=0,column=0)

self.hi_there = Button(frame, text="2011", command=self.Y1)
self.hi_there.grid(row=0,column=1)

self.hi_there = Button(frame, text="2012", command=self.Y2)
self.hi_there.grid(row=0,column=2)

self.hi_there = Button(frame, text="2013", command=self.Y3)
self.hi_there.grid(row=0,column=3)

self.hi_there = Button(frame, text="Save & Exit", command=self.Exit)
self.hi_there.grid(row=0,column=4)

所有按钮功能都必须是查找新的 csv 信息,将它们存储在相同的 csvText 变量中,然后将它们传递给更新标签的更新函数。请注意,当您在屏幕上重绘某些内容时,它不会擦除所有内容并从头开始,因此在重绘时,不要重绘所有按钮和标题,只需重绘所有标签即可。这将节省您的代码行并使其更加优化。

【讨论】:

  • 一直在尝试在我的代码中实现这一点,但遇到了一些麻烦。我刚刚发布了我在下面的位置-代码等。您的建议很棒,并认为我应该走的路>
  • @LewisTownsend:您是否知道答案可能以某种随机顺序出现?例如,在我写这篇评论的时候,这个答案是屏幕上的最后一个。所以,当你说“下面”时,它是没有意义的。
【解决方案3】:

这是我最喜欢的 Tkinter 资源:http://effbot.org/tkinterbook/

标题可以是标签:http://effbot.org/tkinterbook/label.htm

w = Label(master, text="Hello, world!")
w.grid(column=1,row=1)

对于其他所有内容,为以下内容创建一个条目小部件:

textBox = Text(self, height=1,width=1)
textBox.grid(sticky=E,column=1,row=1)

然后像这样插入数据:

self.textBox.insert('end',yourText)

【讨论】:

  • 您好,感谢您这么快就回来了。我一直在阅读发布的链接,说实话,我认为我越来越迷失了>
  • 查看下面的 jbaldwins 答案。它看起来是正确的。请务必注意按钮的命令不包括“()”。如果没有括号,它们将成为与按钮相关联的函数,而无需实际执行这些函数。
  • 看来我应该使用网格。可能为我省去了麻烦。我慢慢地到达那里,但我仍然有问题。下面是我的代码。想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
相关资源
最近更新 更多