A Python tkinter smiley face with buttons that change gestures











up vote
-1
down vote

favorite












Update:
I've managed to create functions for my code and a constructor. The only difficulty I've encountered is whenever I run my program, there's an error name 'SmileyFace' is not defined when I believe I've defined it. I need help as to why SmileyFace isn't defined. Thanks



    from tkinter import *

class SmileyFace:
def __init__(self,righteye,mouth):
self.righteye=righteye
self.mouth=mouth


def smile(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = 'black')
c.delete(mouth)
mouth = c.create_arc(125, 225, 275, 275, start = 0, extent = -180, width = 5, fill = "white")

def sad(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = "black")
c.delete(mouth)
mouth = c.create_arc(125, 250, 275, 300, start = 0, extent = 180, width = 5, fill = "white")

def wink(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_line(225, 140, 250, 165, 275, 140, width = 5, smooth = "true")
c.delete(mouth)
mouth = c.create_line(125, 250, 275, 250, width = 5)

def grin(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = "black")
c.delete(mouth)
mouth = c.create_line(125, 250, 200, 250, 275, 215, width = 5, smooth = "true")

def main():
global c
win = Tk()
c = Canvas(win, width = 800, height = 800)
c.pack()

c.create_oval(100, 100, 350, 350, outline = "black", fill = "yellow")
eye1 = c.create_oval(125, 125, 175, 175, fill = "black")
eye2 = c.create_oval(225, 125, 275, 175, fill = "black")
mouth = c.create_line(125, 250, 275, 250, width = 5)

Smiley = SmileyFace(righteye,mouth)

Button(win,text='Smile',command=Smiley.smile).pack
Button(win, text = "Sad", command = Smiley.sad).pack
Button(win, text = "Wink", command = Smiley.wink).pack
Button(win, text = "Grin", command = Smiley.grin).pack
Button(win, text = "Quit", command = win.destroy).pack

main()









share|improve this question
























  • "tips and suggestions" is off topic for stackoverflow. You need to ask about a very specific problem, and explain how the code you have produces a different result than what you want.
    – Bryan Oakley
    Nov 11 at 4:00












  • Okay thanks for the clarification. I just wondered why the specific functions I've defined for the four gestures haven't managed to do anything. The code I've produced when running only displays the smileyface with the five buttons. When clicked the buttons don't change the current facial gesture, so for example the smileyface would not change once I clicked the wink button.
    – Justin Paul
    Nov 11 at 4:16






  • 1




    You should edit your question to say what you wrote in the comments. That's a specific problem we might be able to help with. Though, it would really help if you took the time to condense the code down to a Minimal, Complete, and Verifiable example. Often, the act of doing that will help you solve the problem by yourself.
    – Bryan Oakley
    Nov 11 at 4:55















up vote
-1
down vote

favorite












Update:
I've managed to create functions for my code and a constructor. The only difficulty I've encountered is whenever I run my program, there's an error name 'SmileyFace' is not defined when I believe I've defined it. I need help as to why SmileyFace isn't defined. Thanks



    from tkinter import *

class SmileyFace:
def __init__(self,righteye,mouth):
self.righteye=righteye
self.mouth=mouth


def smile(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = 'black')
c.delete(mouth)
mouth = c.create_arc(125, 225, 275, 275, start = 0, extent = -180, width = 5, fill = "white")

def sad(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = "black")
c.delete(mouth)
mouth = c.create_arc(125, 250, 275, 300, start = 0, extent = 180, width = 5, fill = "white")

def wink(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_line(225, 140, 250, 165, 275, 140, width = 5, smooth = "true")
c.delete(mouth)
mouth = c.create_line(125, 250, 275, 250, width = 5)

def grin(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = "black")
c.delete(mouth)
mouth = c.create_line(125, 250, 200, 250, 275, 215, width = 5, smooth = "true")

def main():
global c
win = Tk()
c = Canvas(win, width = 800, height = 800)
c.pack()

c.create_oval(100, 100, 350, 350, outline = "black", fill = "yellow")
eye1 = c.create_oval(125, 125, 175, 175, fill = "black")
eye2 = c.create_oval(225, 125, 275, 175, fill = "black")
mouth = c.create_line(125, 250, 275, 250, width = 5)

Smiley = SmileyFace(righteye,mouth)

Button(win,text='Smile',command=Smiley.smile).pack
Button(win, text = "Sad", command = Smiley.sad).pack
Button(win, text = "Wink", command = Smiley.wink).pack
Button(win, text = "Grin", command = Smiley.grin).pack
Button(win, text = "Quit", command = win.destroy).pack

main()









share|improve this question
























  • "tips and suggestions" is off topic for stackoverflow. You need to ask about a very specific problem, and explain how the code you have produces a different result than what you want.
    – Bryan Oakley
    Nov 11 at 4:00












  • Okay thanks for the clarification. I just wondered why the specific functions I've defined for the four gestures haven't managed to do anything. The code I've produced when running only displays the smileyface with the five buttons. When clicked the buttons don't change the current facial gesture, so for example the smileyface would not change once I clicked the wink button.
    – Justin Paul
    Nov 11 at 4:16






  • 1




    You should edit your question to say what you wrote in the comments. That's a specific problem we might be able to help with. Though, it would really help if you took the time to condense the code down to a Minimal, Complete, and Verifiable example. Often, the act of doing that will help you solve the problem by yourself.
    – Bryan Oakley
    Nov 11 at 4:55













up vote
-1
down vote

favorite









up vote
-1
down vote

favorite











Update:
I've managed to create functions for my code and a constructor. The only difficulty I've encountered is whenever I run my program, there's an error name 'SmileyFace' is not defined when I believe I've defined it. I need help as to why SmileyFace isn't defined. Thanks



    from tkinter import *

class SmileyFace:
def __init__(self,righteye,mouth):
self.righteye=righteye
self.mouth=mouth


def smile(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = 'black')
c.delete(mouth)
mouth = c.create_arc(125, 225, 275, 275, start = 0, extent = -180, width = 5, fill = "white")

def sad(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = "black")
c.delete(mouth)
mouth = c.create_arc(125, 250, 275, 300, start = 0, extent = 180, width = 5, fill = "white")

def wink(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_line(225, 140, 250, 165, 275, 140, width = 5, smooth = "true")
c.delete(mouth)
mouth = c.create_line(125, 250, 275, 250, width = 5)

def grin(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = "black")
c.delete(mouth)
mouth = c.create_line(125, 250, 200, 250, 275, 215, width = 5, smooth = "true")

def main():
global c
win = Tk()
c = Canvas(win, width = 800, height = 800)
c.pack()

c.create_oval(100, 100, 350, 350, outline = "black", fill = "yellow")
eye1 = c.create_oval(125, 125, 175, 175, fill = "black")
eye2 = c.create_oval(225, 125, 275, 175, fill = "black")
mouth = c.create_line(125, 250, 275, 250, width = 5)

Smiley = SmileyFace(righteye,mouth)

Button(win,text='Smile',command=Smiley.smile).pack
Button(win, text = "Sad", command = Smiley.sad).pack
Button(win, text = "Wink", command = Smiley.wink).pack
Button(win, text = "Grin", command = Smiley.grin).pack
Button(win, text = "Quit", command = win.destroy).pack

main()









share|improve this question















Update:
I've managed to create functions for my code and a constructor. The only difficulty I've encountered is whenever I run my program, there's an error name 'SmileyFace' is not defined when I believe I've defined it. I need help as to why SmileyFace isn't defined. Thanks



    from tkinter import *

class SmileyFace:
def __init__(self,righteye,mouth):
self.righteye=righteye
self.mouth=mouth


def smile(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = 'black')
c.delete(mouth)
mouth = c.create_arc(125, 225, 275, 275, start = 0, extent = -180, width = 5, fill = "white")

def sad(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = "black")
c.delete(mouth)
mouth = c.create_arc(125, 250, 275, 300, start = 0, extent = 180, width = 5, fill = "white")

def wink(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_line(225, 140, 250, 165, 275, 140, width = 5, smooth = "true")
c.delete(mouth)
mouth = c.create_line(125, 250, 275, 250, width = 5)

def grin(self):
global righteye, mouth
c.delete(righteye)
righteye = c.create_oval(225, 125, 275, 175, fill = "black")
c.delete(mouth)
mouth = c.create_line(125, 250, 200, 250, 275, 215, width = 5, smooth = "true")

def main():
global c
win = Tk()
c = Canvas(win, width = 800, height = 800)
c.pack()

c.create_oval(100, 100, 350, 350, outline = "black", fill = "yellow")
eye1 = c.create_oval(125, 125, 175, 175, fill = "black")
eye2 = c.create_oval(225, 125, 275, 175, fill = "black")
mouth = c.create_line(125, 250, 275, 250, width = 5)

Smiley = SmileyFace(righteye,mouth)

Button(win,text='Smile',command=Smiley.smile).pack
Button(win, text = "Sad", command = Smiley.sad).pack
Button(win, text = "Wink", command = Smiley.wink).pack
Button(win, text = "Grin", command = Smiley.grin).pack
Button(win, text = "Quit", command = win.destroy).pack

main()






python canvas tkinter






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 13 at 6:05









cdlane

16.5k21042




16.5k21042










asked Nov 11 at 2:19









Justin Paul

12




12












  • "tips and suggestions" is off topic for stackoverflow. You need to ask about a very specific problem, and explain how the code you have produces a different result than what you want.
    – Bryan Oakley
    Nov 11 at 4:00












  • Okay thanks for the clarification. I just wondered why the specific functions I've defined for the four gestures haven't managed to do anything. The code I've produced when running only displays the smileyface with the five buttons. When clicked the buttons don't change the current facial gesture, so for example the smileyface would not change once I clicked the wink button.
    – Justin Paul
    Nov 11 at 4:16






  • 1




    You should edit your question to say what you wrote in the comments. That's a specific problem we might be able to help with. Though, it would really help if you took the time to condense the code down to a Minimal, Complete, and Verifiable example. Often, the act of doing that will help you solve the problem by yourself.
    – Bryan Oakley
    Nov 11 at 4:55


















  • "tips and suggestions" is off topic for stackoverflow. You need to ask about a very specific problem, and explain how the code you have produces a different result than what you want.
    – Bryan Oakley
    Nov 11 at 4:00












  • Okay thanks for the clarification. I just wondered why the specific functions I've defined for the four gestures haven't managed to do anything. The code I've produced when running only displays the smileyface with the five buttons. When clicked the buttons don't change the current facial gesture, so for example the smileyface would not change once I clicked the wink button.
    – Justin Paul
    Nov 11 at 4:16






  • 1




    You should edit your question to say what you wrote in the comments. That's a specific problem we might be able to help with. Though, it would really help if you took the time to condense the code down to a Minimal, Complete, and Verifiable example. Often, the act of doing that will help you solve the problem by yourself.
    – Bryan Oakley
    Nov 11 at 4:55
















"tips and suggestions" is off topic for stackoverflow. You need to ask about a very specific problem, and explain how the code you have produces a different result than what you want.
– Bryan Oakley
Nov 11 at 4:00






"tips and suggestions" is off topic for stackoverflow. You need to ask about a very specific problem, and explain how the code you have produces a different result than what you want.
– Bryan Oakley
Nov 11 at 4:00














Okay thanks for the clarification. I just wondered why the specific functions I've defined for the four gestures haven't managed to do anything. The code I've produced when running only displays the smileyface with the five buttons. When clicked the buttons don't change the current facial gesture, so for example the smileyface would not change once I clicked the wink button.
– Justin Paul
Nov 11 at 4:16




Okay thanks for the clarification. I just wondered why the specific functions I've defined for the four gestures haven't managed to do anything. The code I've produced when running only displays the smileyface with the five buttons. When clicked the buttons don't change the current facial gesture, so for example the smileyface would not change once I clicked the wink button.
– Justin Paul
Nov 11 at 4:16




1




1




You should edit your question to say what you wrote in the comments. That's a specific problem we might be able to help with. Though, it would really help if you took the time to condense the code down to a Minimal, Complete, and Verifiable example. Often, the act of doing that will help you solve the problem by yourself.
– Bryan Oakley
Nov 11 at 4:55




You should edit your question to say what you wrote in the comments. That's a specific problem we might be able to help with. Though, it would really help if you took the time to condense the code down to a Minimal, Complete, and Verifiable example. Often, the act of doing that will help you solve the problem by yourself.
– Bryan Oakley
Nov 11 at 4:55












1 Answer
1






active

oldest

votes

















up vote
0
down vote














The only difficulty i've encountered is whenever i run my program,
there's an error name 'SmileyFace' is not defined ...




When I try to run it, after fixing the indentation problems, I get NameError: name 'righteye' is not defined. After fixing that, nothing happens at all when I run it due to a lack of a win.mainloop() at the end. After fixing that, I don't see any buttons due to calls to .pack instead of .pack(). And so on.



You've structured this program poorly. The SmileyFace constructor should have drawn the basic face and saved the right eye and mouth objects as properties instead of trying to deal with them as global variables. Below, I take an even simpler approach which is to use tags to avoid properties and global variables alltogether:



from tkinter import *

class SmileyFace:
def __init__(self, canvas):
self.canvas = canvas

canvas.create_oval(70, 70, 350, 350, fill='yellow')
canvas.create_oval(125, 125, 175, 175, fill='black', tags='left')
canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

def smile(self):
self.canvas.delete('right||mouth')
self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
self.canvas.create_arc(125, 225, 275, 275, extent=-180, width=5, fill='white', tags='mouth')

def sad(self):
self.canvas.delete('right||mouth')
self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
self.canvas.create_arc(125, 250, 275, 300, extent=180, width=5, fill='white', tags='mouth')

def wink(self):
self.canvas.delete('right||mouth')
self.canvas.create_line(225, 140, 250, 165, 275, 140, width=5, smooth='true', tags='right')
self.canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

def grin(self):
self.canvas.delete('right||mouth')
self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
self.canvas.create_line(125, 250, 200, 250, 275, 215, width=5, smooth='true', tags='mouth')

def main():
win = Tk()
canvas = Canvas(win, width=800, height=800)
canvas.pack()

smiley = SmileyFace(canvas)

Button(win, text='Smile', command=smiley.smile).pack()
Button(win, text='Sad', command=smiley.sad).pack()
Button(win, text='Wink', command=smiley.wink).pack()
Button(win, text='Grin', command=smiley.grin).pack()
Button(win, text='Quit', command=win.destroy).pack()

win.mainloop()

main()


enter image description here






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














     

    draft saved


    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53245288%2fa-python-tkinter-smiley-face-with-buttons-that-change-gestures%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    0
    down vote














    The only difficulty i've encountered is whenever i run my program,
    there's an error name 'SmileyFace' is not defined ...




    When I try to run it, after fixing the indentation problems, I get NameError: name 'righteye' is not defined. After fixing that, nothing happens at all when I run it due to a lack of a win.mainloop() at the end. After fixing that, I don't see any buttons due to calls to .pack instead of .pack(). And so on.



    You've structured this program poorly. The SmileyFace constructor should have drawn the basic face and saved the right eye and mouth objects as properties instead of trying to deal with them as global variables. Below, I take an even simpler approach which is to use tags to avoid properties and global variables alltogether:



    from tkinter import *

    class SmileyFace:
    def __init__(self, canvas):
    self.canvas = canvas

    canvas.create_oval(70, 70, 350, 350, fill='yellow')
    canvas.create_oval(125, 125, 175, 175, fill='black', tags='left')
    canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
    canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

    def smile(self):
    self.canvas.delete('right||mouth')
    self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
    self.canvas.create_arc(125, 225, 275, 275, extent=-180, width=5, fill='white', tags='mouth')

    def sad(self):
    self.canvas.delete('right||mouth')
    self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
    self.canvas.create_arc(125, 250, 275, 300, extent=180, width=5, fill='white', tags='mouth')

    def wink(self):
    self.canvas.delete('right||mouth')
    self.canvas.create_line(225, 140, 250, 165, 275, 140, width=5, smooth='true', tags='right')
    self.canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

    def grin(self):
    self.canvas.delete('right||mouth')
    self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
    self.canvas.create_line(125, 250, 200, 250, 275, 215, width=5, smooth='true', tags='mouth')

    def main():
    win = Tk()
    canvas = Canvas(win, width=800, height=800)
    canvas.pack()

    smiley = SmileyFace(canvas)

    Button(win, text='Smile', command=smiley.smile).pack()
    Button(win, text='Sad', command=smiley.sad).pack()
    Button(win, text='Wink', command=smiley.wink).pack()
    Button(win, text='Grin', command=smiley.grin).pack()
    Button(win, text='Quit', command=win.destroy).pack()

    win.mainloop()

    main()


    enter image description here






    share|improve this answer

























      up vote
      0
      down vote














      The only difficulty i've encountered is whenever i run my program,
      there's an error name 'SmileyFace' is not defined ...




      When I try to run it, after fixing the indentation problems, I get NameError: name 'righteye' is not defined. After fixing that, nothing happens at all when I run it due to a lack of a win.mainloop() at the end. After fixing that, I don't see any buttons due to calls to .pack instead of .pack(). And so on.



      You've structured this program poorly. The SmileyFace constructor should have drawn the basic face and saved the right eye and mouth objects as properties instead of trying to deal with them as global variables. Below, I take an even simpler approach which is to use tags to avoid properties and global variables alltogether:



      from tkinter import *

      class SmileyFace:
      def __init__(self, canvas):
      self.canvas = canvas

      canvas.create_oval(70, 70, 350, 350, fill='yellow')
      canvas.create_oval(125, 125, 175, 175, fill='black', tags='left')
      canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
      canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

      def smile(self):
      self.canvas.delete('right||mouth')
      self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
      self.canvas.create_arc(125, 225, 275, 275, extent=-180, width=5, fill='white', tags='mouth')

      def sad(self):
      self.canvas.delete('right||mouth')
      self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
      self.canvas.create_arc(125, 250, 275, 300, extent=180, width=5, fill='white', tags='mouth')

      def wink(self):
      self.canvas.delete('right||mouth')
      self.canvas.create_line(225, 140, 250, 165, 275, 140, width=5, smooth='true', tags='right')
      self.canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

      def grin(self):
      self.canvas.delete('right||mouth')
      self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
      self.canvas.create_line(125, 250, 200, 250, 275, 215, width=5, smooth='true', tags='mouth')

      def main():
      win = Tk()
      canvas = Canvas(win, width=800, height=800)
      canvas.pack()

      smiley = SmileyFace(canvas)

      Button(win, text='Smile', command=smiley.smile).pack()
      Button(win, text='Sad', command=smiley.sad).pack()
      Button(win, text='Wink', command=smiley.wink).pack()
      Button(win, text='Grin', command=smiley.grin).pack()
      Button(win, text='Quit', command=win.destroy).pack()

      win.mainloop()

      main()


      enter image description here






      share|improve this answer























        up vote
        0
        down vote










        up vote
        0
        down vote










        The only difficulty i've encountered is whenever i run my program,
        there's an error name 'SmileyFace' is not defined ...




        When I try to run it, after fixing the indentation problems, I get NameError: name 'righteye' is not defined. After fixing that, nothing happens at all when I run it due to a lack of a win.mainloop() at the end. After fixing that, I don't see any buttons due to calls to .pack instead of .pack(). And so on.



        You've structured this program poorly. The SmileyFace constructor should have drawn the basic face and saved the right eye and mouth objects as properties instead of trying to deal with them as global variables. Below, I take an even simpler approach which is to use tags to avoid properties and global variables alltogether:



        from tkinter import *

        class SmileyFace:
        def __init__(self, canvas):
        self.canvas = canvas

        canvas.create_oval(70, 70, 350, 350, fill='yellow')
        canvas.create_oval(125, 125, 175, 175, fill='black', tags='left')
        canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
        canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

        def smile(self):
        self.canvas.delete('right||mouth')
        self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
        self.canvas.create_arc(125, 225, 275, 275, extent=-180, width=5, fill='white', tags='mouth')

        def sad(self):
        self.canvas.delete('right||mouth')
        self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
        self.canvas.create_arc(125, 250, 275, 300, extent=180, width=5, fill='white', tags='mouth')

        def wink(self):
        self.canvas.delete('right||mouth')
        self.canvas.create_line(225, 140, 250, 165, 275, 140, width=5, smooth='true', tags='right')
        self.canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

        def grin(self):
        self.canvas.delete('right||mouth')
        self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
        self.canvas.create_line(125, 250, 200, 250, 275, 215, width=5, smooth='true', tags='mouth')

        def main():
        win = Tk()
        canvas = Canvas(win, width=800, height=800)
        canvas.pack()

        smiley = SmileyFace(canvas)

        Button(win, text='Smile', command=smiley.smile).pack()
        Button(win, text='Sad', command=smiley.sad).pack()
        Button(win, text='Wink', command=smiley.wink).pack()
        Button(win, text='Grin', command=smiley.grin).pack()
        Button(win, text='Quit', command=win.destroy).pack()

        win.mainloop()

        main()


        enter image description here






        share|improve this answer













        The only difficulty i've encountered is whenever i run my program,
        there's an error name 'SmileyFace' is not defined ...




        When I try to run it, after fixing the indentation problems, I get NameError: name 'righteye' is not defined. After fixing that, nothing happens at all when I run it due to a lack of a win.mainloop() at the end. After fixing that, I don't see any buttons due to calls to .pack instead of .pack(). And so on.



        You've structured this program poorly. The SmileyFace constructor should have drawn the basic face and saved the right eye and mouth objects as properties instead of trying to deal with them as global variables. Below, I take an even simpler approach which is to use tags to avoid properties and global variables alltogether:



        from tkinter import *

        class SmileyFace:
        def __init__(self, canvas):
        self.canvas = canvas

        canvas.create_oval(70, 70, 350, 350, fill='yellow')
        canvas.create_oval(125, 125, 175, 175, fill='black', tags='left')
        canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
        canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

        def smile(self):
        self.canvas.delete('right||mouth')
        self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
        self.canvas.create_arc(125, 225, 275, 275, extent=-180, width=5, fill='white', tags='mouth')

        def sad(self):
        self.canvas.delete('right||mouth')
        self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
        self.canvas.create_arc(125, 250, 275, 300, extent=180, width=5, fill='white', tags='mouth')

        def wink(self):
        self.canvas.delete('right||mouth')
        self.canvas.create_line(225, 140, 250, 165, 275, 140, width=5, smooth='true', tags='right')
        self.canvas.create_line(125, 250, 275, 250, width=5, tags='mouth')

        def grin(self):
        self.canvas.delete('right||mouth')
        self.canvas.create_oval(225, 125, 275, 175, fill='black', tags='right')
        self.canvas.create_line(125, 250, 200, 250, 275, 215, width=5, smooth='true', tags='mouth')

        def main():
        win = Tk()
        canvas = Canvas(win, width=800, height=800)
        canvas.pack()

        smiley = SmileyFace(canvas)

        Button(win, text='Smile', command=smiley.smile).pack()
        Button(win, text='Sad', command=smiley.sad).pack()
        Button(win, text='Wink', command=smiley.wink).pack()
        Button(win, text='Grin', command=smiley.grin).pack()
        Button(win, text='Quit', command=win.destroy).pack()

        win.mainloop()

        main()


        enter image description here







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 13 at 6:00









        cdlane

        16.5k21042




        16.5k21042






























             

            draft saved


            draft discarded



















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53245288%2fa-python-tkinter-smiley-face-with-buttons-that-change-gestures%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Full-time equivalent

            Bicuculline

            さくらももこ