2014-11-13 188 views
0

我创建了一个从列表中读取某些字符串的函数。在tkinter中运行函数

该函数应该在用tkinter创建的框架内显示(或者称为)。

我的想法是创建函数作为框架类的方法(或者可能作为标签的方法)并用新实例调用该方法。结果是,内容显示在控制台中。

到目前为止我的代码:

from Tkinter import * 
root = Tk() 

a = 1 
b = -6 
c = -5 

def calc_x(y): 
    x = 0 
    if y == c: 
     for i in range(1,len(data)): 
      x = x + int(data[i][y]) 
      t = x/(len(data)-1) 
     print str(t)+"%" 
    else: 
     for i in range(1,len(data)): 
      x = x + int(data[i][y]) 
     print x 

class Fram(Frame): 

    def __init__(self,tk,width,height): 
     Frame.__init__(self,tk) 
     self.config(width=width) 
     self.config(height=height) 
     self.config(bd=1) 
     self.config(relief="solid") 

square_frame = Fram(root,500,40).grid(row=0,column=0,padx=3,pady=3) 

mainloop() 

编辑:

ok了,非常感谢你这么远。 我添加了“数据”列表以及源URL。

如何使用任一变量(self.a/b/c)调用函数? 当我创建“Fram”的实例时,它不显示字符串。

from Tkinter import * 
from urllib2 import * 
import csv 

root = Tk() 

class Fram(Frame): 

def __init__(self,tk,width,height): 
    Frame.__init__(self,tk) 
    self.config(width=width) 
    self.config(height=height) 
    self.config(bd=1) 
    self.config(relief="solid") 
    self.url = "http://data.nottinghamtravelwise.org.uk/parking.csv?noLocation=true?t=635509084580321642" 
    self.webpage = urlopen(self.url) 
    self.datareader = csv.reader(self.webpage.read().decode('utf-8').splitlines()) 
    self.data = list(self.datareader) 
    self.a = 1 
    self.b = -6 
    self.c = -5 
    self.value = self.calc_x(self.a) 
    self.label = Label(self, text=self.value) 
    self.label.pack() 

def calc_x(self, y): 
    x = 0 
    if y == self.c: 
     for i in range(1,len(data)): 
      x = x + int(data[i][y]) 
      t = x/(len(data)-1) 
     return str(t)+'%' 
    else: 
     for i in range(1,len(data)): 
      x = x + int(data[i][y]) 
     return str(x) 
+1

到目前为止,代码的实际错误是什么?任何错误消息? –

+0

运行平稳。但我想在框架内调用函数时显示字符串,而不是控制台。 – Jones

+0

我已经改变它,所以实例化Fram现在将显示字符串。你想发生什么样的情况,以便在a,b或c之间选择?如果你想让所有三个都发生,你可以反复调用这个函数并打包一个新的标签。 –

回答

0

我认为你有两个选择,你可以使用Label小部件或Text Widget。标签构件的短字符串更加有用,你会叫这样的:

self.label = Label(self, text="TEXT TO BE INSERTED") 
self.label.pack() 

文本组件可以这样访问:

self.text = Text(self, height=30, width=30) 
self.text.pack() 
self.text.insert(END, "TEXT TO BE INSERTED") 

而且通过它,你应该想想移动的声音该类内部的功能,并从__init__self.calcx(y)调用它。这样你的班级就可以访问你需要的所有信息。

EDIT(尝试了这一点):

from Tkinter import * 
from urllib2 import * 
import csv 

root = Tk() 

class Fram(Frame): 

    def __init__(self,tk,width,height): 
     Frame.__init__(self,tk) 
     self.config(width=width) 
     self.config(height=height) 
     self.config(bd=1) 
     self.config(relief="solid") 
     self.url = "http://data.nottinghamtravelwise.org.uk/parking.csv?noLocation=true?t=635509084580321642" 
     self.webpage = urlopen(self.url) 
     self.datareader = csv.reader(self.webpage.read().decode('utf-8').splitlines()) 
     self.data = list(self.datareader) 
     self.a = 1 
     self.b = -6 
     self.c = -5 
     self.value = self.calc_x(self.a, self.data) 
     self.label = Label(self, text=self.value) 
     self.label.pack() 

    def calc_x(self, y, data): 
     x = 0 
     if y == self.c: 
      for i in range(1,len(data)): 
       x = x + int(data[i][y]) 
       t = x/(len(data)-1) 
      return str(t)+'%' 
     else: 
      for i in range(1,len(data)): 
       x = x + int(data[i][y]) 
      return str(x) 

square_frame = Fram(root,500,40).grid(row=0,column=0,padx=3,pady=3) 

mainloop() 
+0

你的意思是把它作为类的一种方法在类中移动? 或者仅仅是这样的功能,在课堂上移动? – Jones

+0

将其作为方法移入。在'__init__'方法中定义你的变量,然后调用你的方法。顺便说一句,你不应该将'c'和'data'传递给你的函数吗?否则它们将不可见。 –

+0

好,所以我改了一点代码,所以现在运行没有问题,并在窗口中显示数字15007。现在就试试! –

0

好了,多了一些尝试后,我想出了一个非常方便的解决方案。

而不是使用框架,画布项目提供更大的灵活性来放置对象/字符串。

from Tkinter import * 
from urllib2 import * 
import csv 

url = "http://data.nottinghamtravelwise.org.uk/parking.csv?noLocation=true?t=635509084580321642" 
webpage = urlopen(url) 
datareader = csv.reader(webpage.read().decode('utf-8').splitlines()) 
data = list(datareader) 

class elements(Canvas): 

    def __init__(self,tk,shape): 
     Canvas.__init__(self,tk) 
     self.config(width=600) 
     self.method_a() 

    def method_a(self): 
     self.config(height=20) 
     self.config(bd=1) 
     self.config(relief="solid") 
     self.create_text(300,10,text="Sample Text") 

root = Tk() 

first_element = elements(root,"method_a") 
first_element.grid(row=0,column=0,padx=5,pady=2) 

mainloop()