2014-11-13 187 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()