2014-06-20 3 views
1

2 개의 Tkinter 프로그램을 함께 넣으려고합니다. 하나는 사용자가 입력 한 URL에서 각 문자의 모든 항목을 가져오고 텍스트 상자에 각 문자의 개수를 표시합니다. 다른 하나는 히스토그램을 생성하는 turtle 모듈입니다. 각 문자의 어커런스를 히스토그램으로 표시하고 X 축에 문자 레이블을 표시하고 싶습니다. def main():에서 시작tkinter 프레임에 히스토그램 삽입

from tkinter import * 
import tkinter.messagebox 
import urllib.request 
import turtle 

counts = 0 

def main(): 
    analyzeFile(url.get()) 
    list = [counts] 
    drawHistogram(list) 

def analyzeFile(url): 
    try: 
     infile = urllib.request.urlopen(url) 
     s = str(infile.read().decode()) # Read the content as string from the URL 

     counts = countLetters(s.lower()) 

     infile.close() # Close file 
    except ValueError: 
     tkinter.messagebox.showwarning("Analyze URL", 
            "URL " + url + " does not exist") 

def countLetters(s): 
    counts = 26 * [0] # Create and initialize counts 
    for ch in s: 
     if ch.isalpha(): 
      counts[ord(ch) - ord('a')] += 1 
    return counts 

def drawHistogram(list): 
    WIDTH = 400 
    HEIGHT = 300 

    raw_turtle.penup() 
    raw_turtle.goto(-WIDTH/2, -HEIGHT/2) 
    raw_turtle.pendown() 
    raw_turtle.forward(WIDTH) 

    widthOfBar = WIDTH/len(list) 

    for i in range(len(list)): 
     height = list[i] * HEIGHT/max(list) 
     drawABar(-WIDTH/2 + i * widthOfBar, 
      -HEIGHT/2, widthOfBar, height) 

    raw_turtle.hideturtle() 

def drawABar(i, j, widthOfBar, height): 
    raw_turtle.penup() 
    raw_turtle.goto(i, j) 
    raw_turtle.setheading(90) 
    raw_turtle.pendown() 

    raw_turtle.forward(height) 
    raw_turtle.right(90) 
    raw_turtle.forward(widthOfBar) 
    raw_turtle.right(90) 
    raw_turtle.forward(height) 

window = Tk() 
window.title("Occurrence of Letters in a Histogram from URL") 

frame1 = Frame(window) 
frame1.pack() 

scrollbar = Scrollbar(frame1) 
scrollbar.pack(side = RIGHT, fill = Y) 

canvas = tkinter.Canvas(frame1, width=450, height=450) 
raw_turtle = turtle.RawTurtle(canvas) 

scrollbar.config(command = canvas.yview) 
canvas.config(yscrollcommand=scrollbar.set) 
canvas.pack() 

frame2 = Frame(window) 
frame2.pack() 

Label(frame2, text = "Enter a URL: ").pack(side = LEFT) 
url = StringVar() 
Entry(frame2, width = 50, textvariable = url).pack(side = LEFT) 
Button(frame2, text = "Show Result", command = main).pack(side = LEFT) 

window.mainloop() 

히스토그램의 일부입니다

내가 모두 가지고있는 코드입니다. 텍스트 상자 대신 막대 그래프가 나타나게하려면 어떻게 조합해야합니까? 모든 입력에 미리 감사드립니다!

편집 : enter image description here

+0

당신이 Tkinter를 캔버스에 사각형을 그리기보다는 거북이를 사용하려는 특별한 이유가 있습니까? –

+0

그것은 숙제 문제이며 거북이 사용을 명시하고 있습니다. 내 편집에는 화면의 모양이 포함 된 스크린 샷이 포함됩니다. – annabananana7

답변

1

당신은 RawTurtle은 (자세한 내용은 this 항목을 참조)를 사용할 수 있습니다. 코드에 raw_turtle을 정의하십시오.

canvas = tkinter.Canvas(frame1, width=450, height=450) 
raw_turtle = turtle.RawTurtle(canvas) 

히스토그램에 사용하십시오. 전체 코드는 다음과 같이 표시됩니다

from tkinter import * 
import tkinter.messagebox 
import urllib.request 
import turtle 


def main(): 
    counts = analyzeFile(url.get()) 
    drawHistogram(counts) 

def analyzeFile(url): 
    try: 
     infile = urllib.request.urlopen(url) 
     s = str(infile.read().decode()) # Read the content as string from the URL 

     counts = countLetters(s.lower()) 

     infile.close() # Close file 
    except ValueError: 
     tkinter.messagebox.showwarning("Analyze URL", 
      "URL " + url + " does not exist") 

    return counts 

def countLetters(s): 
    counts = 26 * [0] # Create and initialize counts 
    for ch in s: 
     if ch.isalpha(): 
      counts[ord(ch) - ord('a')] += 1 
    return counts 

def drawHistogram(list): 

    WIDTH = 400 
    HEIGHT = 300 

    raw_turtle.penup() 
    raw_turtle.goto(-WIDTH/2, -HEIGHT/2) 
    raw_turtle.pendown() 
    raw_turtle.forward(WIDTH) 

    widthOfBar = WIDTH/len(list) 

    for i in range(len(list)): 
     height = list[i] * HEIGHT/max(list) 
     drawABar(-WIDTH/2 + i * widthOfBar, 
      -HEIGHT/2, widthOfBar, height, letter_number=i) 

    raw_turtle.hideturtle() 

def drawABar(i, j, widthOfBar, height, letter_number): 
    alf='abcdefghijklmnopqrstuvwxyz' 
    raw_turtle.penup() 
    raw_turtle.goto(i+2, j-20) 

    #sign letter on histogram 
    raw_turtle.write(alf[letter_number]) 
    raw_turtle.goto(i, j) 

    raw_turtle.setheading(90) 
    raw_turtle.pendown() 


    raw_turtle.forward(height) 
    raw_turtle.right(90) 
    raw_turtle.forward(widthOfBar) 
    raw_turtle.right(90) 
    raw_turtle.forward(height) 

window = Tk() 
window.title("Occurrence of Letters in a Histogram from URL") 

frame1 = Frame(window) 
frame1.pack() 

scrollbar = Scrollbar(frame1) 
scrollbar.pack(side = RIGHT, fill = Y) 

canvas = tkinter.Canvas(frame1, width=450, height=450) 
raw_turtle = turtle.RawTurtle(canvas) 

scrollbar.config(command = canvas.yview) 
canvas.config(yscrollcommand=scrollbar.set) 
canvas.pack() 

frame2 = Frame(window) 
frame2.pack() 

Label(frame2, text = "Enter a URL: ").pack(side = LEFT) 
url = StringVar() 
Entry(frame2, width = 50, textvariable = url).pack(side = LEFT) 
Button(frame2, text = "Show Result", command = main).pack(side = LEFT) 

window.mainloop() 

This 항목을 유용 할 수있는 캔버스에 스크롤바를 사용하는 방법에 대해.

나는 위의 코드를 실행하면
, 나는이 참조 편집 : enter image description here

+0

좋아, 캔버스에 거북이가 보이지만 어떻게'Label','Entry' 또는'Button' 위젯이 보이지 않습니까? – annabananana7

+0

@ annabananana7 흠. 위 코드를 실행하면 모든 윙셋을 볼 수 있습니다. 스크린 샷을 추가했습니다. – NorthCat

+0

내가보기에 내 스크린 샷을 추가했습니다. \ – annabananana7

관련 문제