How to get reference to an instance attribute, and modify its value from outside












0















I'm working on an application in tkinter. I have many Entry widgets in UI, and a few classes in app engine. I need to bind tkinter variables of those entries to instances attributes.



i.e.:



class Pipe(Variable):
"""class for pipes"""

def __init__(self):
self.diameter = 0
self.variables = {}

pipe1 = Pipe(self)
pipe2 = Pipe(self)


I want to bind value from one entry to pipe1.diameter, and value from another entry to pipe2.diameter. I'm doing it by a trace function, where is lambda statement, pointing to a function, which identifies entry, and, using a dictionary proper for each instance, pass a value from entry to dictionary value. Dictionaries are produced like here, and then passed as instance attribute:



def pipe1_vars(object_):
variables = {
'ui_variable_name_for_pipe1_diameter': [object_.diameter]
}
return variables

def pipe2_vars(object_):
variables = {
'ui_variable_name_for_pipe2_diameter': [object_.diameter]
}
return variables

pipe1.variables = pipe1_vars(pipe1)
pipe2.variables = pipe2_vars(pipe2)


Unfortunately, Variable class method, assigning value, isn't working properly.



class Variable():
def set_var_value(variable_name, value):
ui_variable = tkinterbuilder.get_variable(variable_name)
self.variables[variable_name][0] = value
if ui_variable.get() != value:
ui_variable.set(value)


Obviously self.variables[variable_name][0] is something different than self.diameter. The dictionary value is changing, but instance.diameter stays the same.



How can I pass a real instance attribute to this method, instead of a copy in a dictionary value?



I'm assuming it is important to my app, to build something working as those dictionaries, because i need to bind similar attributes of different pipes to different entries - so it's have to be defined outside of a Pipe() class. I don't know if I should change dictionary to something else, or maybe should I rebuild those functions, building dictionary. I've run out of ideas, what to ask google.



Code is much complex, I've posted only most important elements, but if any other details are important, please note in comment.










share|improve this question



























    0















    I'm working on an application in tkinter. I have many Entry widgets in UI, and a few classes in app engine. I need to bind tkinter variables of those entries to instances attributes.



    i.e.:



    class Pipe(Variable):
    """class for pipes"""

    def __init__(self):
    self.diameter = 0
    self.variables = {}

    pipe1 = Pipe(self)
    pipe2 = Pipe(self)


    I want to bind value from one entry to pipe1.diameter, and value from another entry to pipe2.diameter. I'm doing it by a trace function, where is lambda statement, pointing to a function, which identifies entry, and, using a dictionary proper for each instance, pass a value from entry to dictionary value. Dictionaries are produced like here, and then passed as instance attribute:



    def pipe1_vars(object_):
    variables = {
    'ui_variable_name_for_pipe1_diameter': [object_.diameter]
    }
    return variables

    def pipe2_vars(object_):
    variables = {
    'ui_variable_name_for_pipe2_diameter': [object_.diameter]
    }
    return variables

    pipe1.variables = pipe1_vars(pipe1)
    pipe2.variables = pipe2_vars(pipe2)


    Unfortunately, Variable class method, assigning value, isn't working properly.



    class Variable():
    def set_var_value(variable_name, value):
    ui_variable = tkinterbuilder.get_variable(variable_name)
    self.variables[variable_name][0] = value
    if ui_variable.get() != value:
    ui_variable.set(value)


    Obviously self.variables[variable_name][0] is something different than self.diameter. The dictionary value is changing, but instance.diameter stays the same.



    How can I pass a real instance attribute to this method, instead of a copy in a dictionary value?



    I'm assuming it is important to my app, to build something working as those dictionaries, because i need to bind similar attributes of different pipes to different entries - so it's have to be defined outside of a Pipe() class. I don't know if I should change dictionary to something else, or maybe should I rebuild those functions, building dictionary. I've run out of ideas, what to ask google.



    Code is much complex, I've posted only most important elements, but if any other details are important, please note in comment.










    share|improve this question

























      0












      0








      0


      0






      I'm working on an application in tkinter. I have many Entry widgets in UI, and a few classes in app engine. I need to bind tkinter variables of those entries to instances attributes.



      i.e.:



      class Pipe(Variable):
      """class for pipes"""

      def __init__(self):
      self.diameter = 0
      self.variables = {}

      pipe1 = Pipe(self)
      pipe2 = Pipe(self)


      I want to bind value from one entry to pipe1.diameter, and value from another entry to pipe2.diameter. I'm doing it by a trace function, where is lambda statement, pointing to a function, which identifies entry, and, using a dictionary proper for each instance, pass a value from entry to dictionary value. Dictionaries are produced like here, and then passed as instance attribute:



      def pipe1_vars(object_):
      variables = {
      'ui_variable_name_for_pipe1_diameter': [object_.diameter]
      }
      return variables

      def pipe2_vars(object_):
      variables = {
      'ui_variable_name_for_pipe2_diameter': [object_.diameter]
      }
      return variables

      pipe1.variables = pipe1_vars(pipe1)
      pipe2.variables = pipe2_vars(pipe2)


      Unfortunately, Variable class method, assigning value, isn't working properly.



      class Variable():
      def set_var_value(variable_name, value):
      ui_variable = tkinterbuilder.get_variable(variable_name)
      self.variables[variable_name][0] = value
      if ui_variable.get() != value:
      ui_variable.set(value)


      Obviously self.variables[variable_name][0] is something different than self.diameter. The dictionary value is changing, but instance.diameter stays the same.



      How can I pass a real instance attribute to this method, instead of a copy in a dictionary value?



      I'm assuming it is important to my app, to build something working as those dictionaries, because i need to bind similar attributes of different pipes to different entries - so it's have to be defined outside of a Pipe() class. I don't know if I should change dictionary to something else, or maybe should I rebuild those functions, building dictionary. I've run out of ideas, what to ask google.



      Code is much complex, I've posted only most important elements, but if any other details are important, please note in comment.










      share|improve this question














      I'm working on an application in tkinter. I have many Entry widgets in UI, and a few classes in app engine. I need to bind tkinter variables of those entries to instances attributes.



      i.e.:



      class Pipe(Variable):
      """class for pipes"""

      def __init__(self):
      self.diameter = 0
      self.variables = {}

      pipe1 = Pipe(self)
      pipe2 = Pipe(self)


      I want to bind value from one entry to pipe1.diameter, and value from another entry to pipe2.diameter. I'm doing it by a trace function, where is lambda statement, pointing to a function, which identifies entry, and, using a dictionary proper for each instance, pass a value from entry to dictionary value. Dictionaries are produced like here, and then passed as instance attribute:



      def pipe1_vars(object_):
      variables = {
      'ui_variable_name_for_pipe1_diameter': [object_.diameter]
      }
      return variables

      def pipe2_vars(object_):
      variables = {
      'ui_variable_name_for_pipe2_diameter': [object_.diameter]
      }
      return variables

      pipe1.variables = pipe1_vars(pipe1)
      pipe2.variables = pipe2_vars(pipe2)


      Unfortunately, Variable class method, assigning value, isn't working properly.



      class Variable():
      def set_var_value(variable_name, value):
      ui_variable = tkinterbuilder.get_variable(variable_name)
      self.variables[variable_name][0] = value
      if ui_variable.get() != value:
      ui_variable.set(value)


      Obviously self.variables[variable_name][0] is something different than self.diameter. The dictionary value is changing, but instance.diameter stays the same.



      How can I pass a real instance attribute to this method, instead of a copy in a dictionary value?



      I'm assuming it is important to my app, to build something working as those dictionaries, because i need to bind similar attributes of different pipes to different entries - so it's have to be defined outside of a Pipe() class. I don't know if I should change dictionary to something else, or maybe should I rebuild those functions, building dictionary. I've run out of ideas, what to ask google.



      Code is much complex, I've posted only most important elements, but if any other details are important, please note in comment.







      python oop reference






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 19 '18 at 22:29









      bloniaqbloniaq

      195




      195
























          1 Answer
          1






          active

          oldest

          votes


















          0














          If the number of Pipe attributes is small, make them properties, and when you create a Pipe object, pass it the corresponding tk binded variable:



          import tkinter as tk
          from tkinter import Tk, ttk

          root = Tk()
          var_e1 = tk.StringVar()

          def print_e1():
          print(var_e1.get())

          def inc_e1():
          var_e1.set(int(var_e1.get())+1)

          class Pipe():
          def __init__(self, tkvar):
          self.tkvar = tkvar
          tkvar.set('')

          @property
          def diameter(self):
          return self.tkvar.get()

          @diameter.setter
          def diameter(self, value):
          self.tkvar.set(value)

          e1 = tk.Entry(root, textvariable=var_e1)
          b1 = tk.Button(root, text='Print e1', command=print_e1)
          b2 = tk.Button(root, text='Increment e1', command=inc_e1)

          e1.pack(side=tk.LEFT)
          b1.pack()
          b2.pack()

          p1 = Pipe(var_e1)
          p1.diameter = 200

          root.mainloop()





          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',
            autoActivateHeartbeat: false,
            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%2f53383572%2fhow-to-get-reference-to-an-instance-attribute-and-modify-its-value-from-outside%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









            0














            If the number of Pipe attributes is small, make them properties, and when you create a Pipe object, pass it the corresponding tk binded variable:



            import tkinter as tk
            from tkinter import Tk, ttk

            root = Tk()
            var_e1 = tk.StringVar()

            def print_e1():
            print(var_e1.get())

            def inc_e1():
            var_e1.set(int(var_e1.get())+1)

            class Pipe():
            def __init__(self, tkvar):
            self.tkvar = tkvar
            tkvar.set('')

            @property
            def diameter(self):
            return self.tkvar.get()

            @diameter.setter
            def diameter(self, value):
            self.tkvar.set(value)

            e1 = tk.Entry(root, textvariable=var_e1)
            b1 = tk.Button(root, text='Print e1', command=print_e1)
            b2 = tk.Button(root, text='Increment e1', command=inc_e1)

            e1.pack(side=tk.LEFT)
            b1.pack()
            b2.pack()

            p1 = Pipe(var_e1)
            p1.diameter = 200

            root.mainloop()





            share|improve this answer




























              0














              If the number of Pipe attributes is small, make them properties, and when you create a Pipe object, pass it the corresponding tk binded variable:



              import tkinter as tk
              from tkinter import Tk, ttk

              root = Tk()
              var_e1 = tk.StringVar()

              def print_e1():
              print(var_e1.get())

              def inc_e1():
              var_e1.set(int(var_e1.get())+1)

              class Pipe():
              def __init__(self, tkvar):
              self.tkvar = tkvar
              tkvar.set('')

              @property
              def diameter(self):
              return self.tkvar.get()

              @diameter.setter
              def diameter(self, value):
              self.tkvar.set(value)

              e1 = tk.Entry(root, textvariable=var_e1)
              b1 = tk.Button(root, text='Print e1', command=print_e1)
              b2 = tk.Button(root, text='Increment e1', command=inc_e1)

              e1.pack(side=tk.LEFT)
              b1.pack()
              b2.pack()

              p1 = Pipe(var_e1)
              p1.diameter = 200

              root.mainloop()





              share|improve this answer


























                0












                0








                0







                If the number of Pipe attributes is small, make them properties, and when you create a Pipe object, pass it the corresponding tk binded variable:



                import tkinter as tk
                from tkinter import Tk, ttk

                root = Tk()
                var_e1 = tk.StringVar()

                def print_e1():
                print(var_e1.get())

                def inc_e1():
                var_e1.set(int(var_e1.get())+1)

                class Pipe():
                def __init__(self, tkvar):
                self.tkvar = tkvar
                tkvar.set('')

                @property
                def diameter(self):
                return self.tkvar.get()

                @diameter.setter
                def diameter(self, value):
                self.tkvar.set(value)

                e1 = tk.Entry(root, textvariable=var_e1)
                b1 = tk.Button(root, text='Print e1', command=print_e1)
                b2 = tk.Button(root, text='Increment e1', command=inc_e1)

                e1.pack(side=tk.LEFT)
                b1.pack()
                b2.pack()

                p1 = Pipe(var_e1)
                p1.diameter = 200

                root.mainloop()





                share|improve this answer













                If the number of Pipe attributes is small, make them properties, and when you create a Pipe object, pass it the corresponding tk binded variable:



                import tkinter as tk
                from tkinter import Tk, ttk

                root = Tk()
                var_e1 = tk.StringVar()

                def print_e1():
                print(var_e1.get())

                def inc_e1():
                var_e1.set(int(var_e1.get())+1)

                class Pipe():
                def __init__(self, tkvar):
                self.tkvar = tkvar
                tkvar.set('')

                @property
                def diameter(self):
                return self.tkvar.get()

                @diameter.setter
                def diameter(self, value):
                self.tkvar.set(value)

                e1 = tk.Entry(root, textvariable=var_e1)
                b1 = tk.Button(root, text='Print e1', command=print_e1)
                b2 = tk.Button(root, text='Increment e1', command=inc_e1)

                e1.pack(side=tk.LEFT)
                b1.pack()
                b2.pack()

                p1 = Pipe(var_e1)
                p1.diameter = 200

                root.mainloop()






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 21 '18 at 15:18









                progmaticoprogmatico

                1,8671512




                1,8671512






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53383572%2fhow-to-get-reference-to-an-instance-attribute-and-modify-its-value-from-outside%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

                    MongoDB - Not Authorized To Execute Command

                    How to fix TextFormField cause rebuild widget in Flutter

                    in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith