2016-06-03 8 views
-1

ive bekam zwei separate Programme, die beide ich habe von Stackoverflow, und beide Werke auf ihre eigenen hier ist der erste:Python tkinter Zeichenprogramm

import tkinter as tk 
    import os 

    w, h = 500, 200 

    # Add a couple widgets. We're going to put pygame in `embed`. 
    root = tk.Tk() 
    embed = tk.Frame(root, width=w, height=h) 
    embed.pack() 
    text = tk.Button(root, text='Blah.') 
    text.pack() 

    # Tell pygame's SDL window which window ID to use  
    os.environ['SDL_WINDOWID'] = str(embed.winfo_id()) 

    # The wxPython wiki says you might need the following line on Windows 
    # (http://wiki.wxpython.org/IntegratingPyGame). 
    #os.environ['SDL_VIDEODRIVER'] = 'windib' 

    # Show the window so it's assigned an ID. 
    root.update() 

    # Usual pygame initialization 
    import pygame as pg 
    pg.display.init() 
    screen = pg.display.set_mode((w,h)) 

    pos = 0 
    while 1: 
     # Do some pygame stuff 
     screen.fill(pg.Color(0,0,0)) 
     pos = (pos + 1) % screen.get_width() 
     pg.draw.circle(screen, pg.Color(255,255,255), (pos,100), 30) 

     # Update the pygame display 
     pg.display.flip() 

     # Update the Tk display 
     root.update() 

Dieses Programm sollte ein pygame Fenster in einen tkinter Rahmen einbetten, es wirkt wie ein Zauber ist, hier das zweite Programm:

import pygame, random 

    screen = pygame.display.set_mode((800,600)) 

    draw_on = False 
    last_pos = (0, 0) 
    color = (0, 0, 0) 
    white = (255,255,255) 
    radius = 10 
    screen.fill(white) 

    def roundline(srf, color, start, end, radius=1): 
     dx = end[0]-start[0] 
     dy = end[1]-start[1] 
     distance = max(abs(dx), abs(dy)) 
     for i in range(distance): 
      x = int(start[0]+float(i)/distance*dx) 
      y = int(start[1]+float(i)/distance*dy) 
      pygame.draw.circle(srf, color, (x, y), radius) 

    try: 
     while True: 
      e = pygame.event.wait() 
      if e.type == pygame.QUIT: 
       raise StopIteration 
      if e.type == pygame.MOUSEBUTTONDOWN: 
       pygame.draw.circle(screen, color, e.pos, radius) 
       draw_on = True 
      if e.type == pygame.MOUSEBUTTONUP: 
       draw_on = False 
      if e.type == pygame.MOUSEMOTION: 
       if draw_on: 
        pygame.draw.circle(screen, color, e.pos, radius) 
        roundline(screen, color, e.pos, last_pos, radius) 
       last_pos = e.pos 
      pygame.display.flip() 

    except StopIteration: 
     pass 

pygame.quit() 

der zweite ein pygame Bildschirm auf wich Anzeige sollten Sie alles, was Sie gerne ziehen.

Ich bin kein sehr expierenced pygame Programmierer aber ich habe expierence tkinter verwenden, was ich tun möchte, ist ein Programm auf Wich machen Sie zeichnen können, aber es muss auch tkinter Tasten haben, Eintrag des usw.

beide Programme funktioniert perfekt gut allein, aber wenn ich den pygame Teil im ersten Programm ersetzen will, funktioniert alles gut außer, ich kann nichts zeichnen, die Schaltfläche nicht angeklickt werden, und ich kann nicht über x, das tut macht überhaupt keinen Sinn, also denke ich, dass es vielleicht etwas falsches gibt, ich kann das Problem nicht so finden, dass ich jeden Rat schätze.

danke

+0

Sag nur, du solltest wirklich keine Ausnahmen aufstellen und try-catch verwenden, um aus Loops auszubrechen. – Alex

+0

ok, ich nehme es heraus, ich habe es aber nicht dort hingelegt, es war was ich vom Programm bekommen habe, ich habe es gerade heruntergeladen es :-) –

Antwort

0

ich die Antwort aus mir actualy herausgefunden haben, ich der Grund pygame verwendete becouse ich denke, didnt Sie tkinter verwenden könnte, aber ich habe ein Programm, das tkinter verwendet und actuely zieht recht gut (vielleicht besser als pygame) i

from tkinter import * 


    b1 = "up" 
    xold, yold = None, None 
    display_width = '500' 
    display_height = '500' 
    canvas_width = '500' 
    canvas_height = '500' 
    def main(): 
     root = Tk() 
     root.geometry((display_width+"x"+display_height)) 


     drawing_area = Canvas(root,width=canvas_width,height=canvas_height,bg="white") 
     drawing_area.bind("<Motion>", motion) 
     drawing_area.bind("<ButtonPress-1>", b1down) 
     drawing_area.bind("<ButtonRelease-1>", b1up) 
     drawing_area.pack(side=RIGHT) 
     root.mainloop() 

    def b1down(event): 
     global b1 
     x1, y1 = (event.x - 4), (event.y - 4) 
     x2, y2 = (event.x + 4), (event.y + 4) 
     event.widget.create_oval(x1, y1, x2, y2, fill = "black") 
     b1 = "down"   # you only want to draw when the button is down 
           # because "Motion" events happen -all the time- 

    def b1up(event): 
     global b1, xold, yold 
     b1 = "up" 
     xold = None   # reset the line when you let go of the button 
     yold = None 

    def motion(event): 
     if b1 == "down": 
      global xold, yold 
      x1, y1 = (event.x - 4), (event.y - 4) 
      x2, y2 = (event.x + 4), (event.y + 4) 
      event.widget.create_oval(x1, y1, x2, y2, fill = "black") 
      if xold is not None and yold is not None: 
       python_green = "#476042" 
       x1, y1 = (event.x - 4), (event.y - 4) 
       x2, y2 = (event.x + 4), (event.y + 4) 
       event.widget.create_oval(x1, y1, x2, y2, fill = "black") 
       event.widget.create_line(xold,yold,event.x,event.y,smooth=TRUE,width=9) 
           # here's where you draw it. smooth. neat. 
      xold = event.x 
      yold = event.y 

    if __name__ == "__main__": 
     main() 

dieses Programm unterscheidet sich von anderen Leinwand Zeichenprogrammen dieses Programm fügt becouse es beide Linien und Ellipsen verwendet, stehen die Chancen von Lücken in Linien, vielen dank für jedermann zu minimieren, die dies gesehen, ich hoffe, Sie fand diese nützliche