from tkinter import *
from tkinter import ttk
parent = Tk()
p = ttk.Panedwindow(parent, orient=HORIZONTAL)
p.pack(fill=BOTH, expand=1)
p1 = ttk.Panedwindow(parent, orient=HORIZONTAL)
p1.pack(fill=BOTH, expand=1)
f4 =ttk.Labelframe(p1, text='marks numbers histograms', width =400, height = 100)
p1.add(f4)
# declare and set variable(s)
marks_to_hist = StringVar()
# ROUTINE OPENS MARKS , TALLIES RANGES, DRAWS HISTOGRAM
def open_marks_numbers():
N = int(marks_to_hist.get())
N = N * 5
marks = []
for line in open('marks.txt').readlines():
datafile = (line.strip().split('\t')[0].split(','))
for n in datafile:
marks.append(int(n))
marks=marks[:N]
return marks
def open_numbers_for_draw(n):
marks = open_marks_numbers()
return marks[n-1::5]
def count_marks_range(numbers):
marks_range_tally = [0] * 12
for num in numbers[:]:
which_range=int(num//5)
marks_range_tally[which_range] = marks_range_tally[which_range] + 1
return marks_range_tally
def get_marks_tally():
marks_range_tally = []
draw_nums = [1,2,3,4,5] #or range(1,6)
for n in draw_nums:
numbers = open_numbers_for_draw(n)
marks_range_tally.append(count_marks_range(numbers)) #create histogram, append to list
return marks_range_tally
def write_histogram_marks():
'''
histogram format:
1 - 4 **
5 - 9 ***
10 - 14 ******
15 -19 **
45 - 49 ****
50 *
'''
import tkinter.filedialog
histfilesaved =tkinter.filedialog.askopenfilename()
histfile=open(histfilesaved,'w')
marks_range_tally = get_marks_tally()
# convert list to integers using list comprehension
marks_count1 = [int(i) for i in marks_range_tally[0]]
marks_count2 = [int(i) for i in marks_range_tally[1]]
marks_count3 = [int(i) for i in marks_range_tally[2]]
marks_count4 = [int(i) for i in marks_range_tally[3]]
marks_count5 = [int(i) for i in marks_range_tally[4]]
print(marks_count1 ,'\n', marks_count2, '\n' , marks_count3 , '\n', marks_count4 , '\n' , marks_count5)
histfile.write('distribution of marks numbers \n')
histfile.write('1-4: ')
histfile.write('*' * marks_count1[0])
histfile.write(' ' * (22 -marks_count1[0]))
histfile.write('1-4: ')
histfile.write('*' * marks_count2[0])
histfile.write(' ' * (22 -marks_count2[0]))
histfile.write('1-4: ')
histfile.write('*' * marks_count3[0])
histfile.write(' ' * (22 -marks_count3[0]))
histfile.write('1-4: ')
histfile.write('*' * marks_count4[0])
histfile.write(' ' * (22 -marks_count4[0]))
histfile.write('1-4: ')
histfile.write('*' * marks_count5[0])
histfile.write('\n')
histfile.write('5-9: ')
histfile.write('*' * marks_count1[1])
histfile.write(' ' * (22 -marks_count1[1]))
histfile.write('5-9: ')
histfile.write('*' * marks_count2[1])
histfile.write(' ' * (22 -marks_count2[1]))
histfile.write('5-9: ')
histfile.write('*' * marks_count3[1])
histfile.write(' ' * (22 -marks_count3[1]))
histfile.write('5-9: ')
histfile.write('*' * marks_count4[1])
histfile.write(' ' * (22 -marks_count4[1]))
histfile.write('5-9: ')
histfile.write('*' * marks_count5[1])
histfile.write('\n')
for i in range(2,10):
low = i * 5
high = i * 5 + 4
histfile.write(str(low) + '-' + str(high) + ': ')
histfile.write('*' * marks_count1[i])
histfile.write(' ' * (22 -marks_count1[i]))
histfile.write(str(low) + '-' + str(high) + ': ')
histfile.write('*' * marks_count2[i])
histfile.write(' ' * (22 -marks_count2[i]))
histfile.write(str(low) + '-' + str(high) + ': ')
histfile.write('*' * marks_count3[i])
histfile.write(' ' * (22 -marks_count3[i]))
histfile.write(str(low) + '-' + str(high) + ': ')
histfile.write('*' * marks_count4[i])
histfile.write(' ' * (22 -marks_count4[i]))
histfile.write(str(low) + '-' + str(high) + ': ')
histfile.write('*' * marks_count5[i])
histfile.write('\n')
histfile.write('50: ')
histfile.write('*' * marks_count1[-1])
histfile.write(' ' * (22 -marks_count1[-1]))
histfile.write('50: ')
histfile.write('*' * marks_count2[-1])
histfile.write(' ' * (22 -marks_count2[-1]))
histfile.write('50: ')
histfile.write('*' * marks_count3[-1])
histfile.write(' ' * (22 -marks_count3[-1]))
histfile.write('50: ')
histfile.write('*' * marks_count4[-1])
histfile.write(' ' * (22 -marks_count4[-1]))
histfile.write('50: ')
histfile.write('*' * marks_count5[-1])
histfile.write('\n')
histfile.close()
# ENDS marks NUMBERS FUNCTION
def evClear():
num_draws.delete(0, END) ()# clears entry but causes error
num_draws.focus() # places the cursor into the text box
def replace_histogram():
data=open('histfile.txt','r')
myData= data.read() # read the file to variable
data.close()
ViewHistogramWidget.insert(0.0,myData)
'''
BOTTOMFRAME (LEFT)
marks NUMBERS HISTOGRAMS
'''
from_lbl = Label(f4, text='how many records ? ', font='comic-sans-MS')
from_lbl.pack(side=TOP)
num_draws =Entry(f4, textvariable=marks_to_hist, font='comic-sans-MS', width='2',insertbackground= 'red')
num_draws.pack(side=TOP) # enter number of records
enter_btn1 = Button(f4,text='draw new histogram', font='comic-sans-MS', command=replace_histogram)
enter_btn1.pack(side = BOTTOM, padx = 25)
clear_btn = Button(f4, text='clear', font='comic-sans-MS', command = evClear)
clear_btn.pack(side=BOTTOM, padx = 5)
ViewHistogramWidget= Text(f4, width = 150) # set up a text widget as a root (window) child
with open('histfile.txt','r') as data:
myText= data.read() # read the file to variable
data.close() # close file handle
ViewHistogramWidget.insert(0.0,myText) # insert the file's text into the text widget
ViewHistogramWidget.pack(expand=1, fill=BOTH) # show the widget
mainloop()
标记数据位于逗号分隔文件中,每个记录有五个标记 例如
1,2,3,4,5
6,7,8,9,3
histfile是一个简单的文本文件。
此“例程”正确显示由write_histogram_marks()
生成的histfile的输出。
我希望它能够做的是根据用户定义的所需记录数(输入变量marks_to_hist
)生成新的直方图文件,并将新文件写入文本窗口(删除前一个显示)。但是,使用replace_histogram
只会在已显示的文件下面重写相同的文件。此外,我想用evClear
按钮清除输入字段和文本窗口。此时它会删除条目但会生成错误。我确信我的histfile.write程序是完全笨拙和重复的,但这是像我这样的“新手”可以解决的唯一方法。
不得不说我在stackOverflow上得到了很多民间帮助来实现这一目标。非常感谢
答案 0 :(得分:5)
使用以下类并使用新的setText和clear方法替换Text和Entry小部件:
import Tkinter
class HistogramViewer(Tkinter.Text):
def setText(self, text):
self.clear()
self.insert(Tkinter.END, text)
def clear(self):
self.delete("1.0", Tkinter.END)
class HistogramEntry(Tkinter.Entry):
def setText(self, text):
self.clear()
self.insert(0, text)
def clear(self):
self.delete(0, Tkinter.END)
根据Bryan Oakley的通知改进。