Defining function or class to browse and list multiple directories with tkinter












0















I would like to create a function or class that has the proper formatting to create a text label, entry field, and button. The button would allow me to browse through my directory and populate the entry field with the chosen directory. The code I have allows me to do most of this, however the directory is always populated in the last entry field instead of the one the button refers to.



I am new to tkinter and GUIs so apologies if this is a simple solution, I assume the problem is with root.name.set referring to the function that was called last.



from tkinter import *
from tkinter import filedialog

def askdirectory():
dirname = filedialog.askdirectory()
root.name.set(dirname)


def dirField(root, label, rowNum):
text = StringVar()
text.set(label)
dirText = Label(root, textvariable = text, height =4)
dirText.grid(row = rowNum, column = 1)

dirBut = Button(root, text = 'Browse', command = askdirectory)
dirBut.grid(row = rowNum, column = 3)

root.name = StringVar()
adDir = Entry(root,textvariable = root.name, width = 100)
adDir.grid(row = rowNum, column = 2)


if __name__ == '__main__':
root = Tk()
root.geometry('1000x750')

adText = "Select directory of Ads"
userText = "Select directory of User credentials"

adField = dirField(root, adText, 1)
userField = dirField(root, userText, 2)

root.mainloop()









share|improve this question



























    0















    I would like to create a function or class that has the proper formatting to create a text label, entry field, and button. The button would allow me to browse through my directory and populate the entry field with the chosen directory. The code I have allows me to do most of this, however the directory is always populated in the last entry field instead of the one the button refers to.



    I am new to tkinter and GUIs so apologies if this is a simple solution, I assume the problem is with root.name.set referring to the function that was called last.



    from tkinter import *
    from tkinter import filedialog

    def askdirectory():
    dirname = filedialog.askdirectory()
    root.name.set(dirname)


    def dirField(root, label, rowNum):
    text = StringVar()
    text.set(label)
    dirText = Label(root, textvariable = text, height =4)
    dirText.grid(row = rowNum, column = 1)

    dirBut = Button(root, text = 'Browse', command = askdirectory)
    dirBut.grid(row = rowNum, column = 3)

    root.name = StringVar()
    adDir = Entry(root,textvariable = root.name, width = 100)
    adDir.grid(row = rowNum, column = 2)


    if __name__ == '__main__':
    root = Tk()
    root.geometry('1000x750')

    adText = "Select directory of Ads"
    userText = "Select directory of User credentials"

    adField = dirField(root, adText, 1)
    userField = dirField(root, userText, 2)

    root.mainloop()









    share|improve this question

























      0












      0








      0








      I would like to create a function or class that has the proper formatting to create a text label, entry field, and button. The button would allow me to browse through my directory and populate the entry field with the chosen directory. The code I have allows me to do most of this, however the directory is always populated in the last entry field instead of the one the button refers to.



      I am new to tkinter and GUIs so apologies if this is a simple solution, I assume the problem is with root.name.set referring to the function that was called last.



      from tkinter import *
      from tkinter import filedialog

      def askdirectory():
      dirname = filedialog.askdirectory()
      root.name.set(dirname)


      def dirField(root, label, rowNum):
      text = StringVar()
      text.set(label)
      dirText = Label(root, textvariable = text, height =4)
      dirText.grid(row = rowNum, column = 1)

      dirBut = Button(root, text = 'Browse', command = askdirectory)
      dirBut.grid(row = rowNum, column = 3)

      root.name = StringVar()
      adDir = Entry(root,textvariable = root.name, width = 100)
      adDir.grid(row = rowNum, column = 2)


      if __name__ == '__main__':
      root = Tk()
      root.geometry('1000x750')

      adText = "Select directory of Ads"
      userText = "Select directory of User credentials"

      adField = dirField(root, adText, 1)
      userField = dirField(root, userText, 2)

      root.mainloop()









      share|improve this question














      I would like to create a function or class that has the proper formatting to create a text label, entry field, and button. The button would allow me to browse through my directory and populate the entry field with the chosen directory. The code I have allows me to do most of this, however the directory is always populated in the last entry field instead of the one the button refers to.



      I am new to tkinter and GUIs so apologies if this is a simple solution, I assume the problem is with root.name.set referring to the function that was called last.



      from tkinter import *
      from tkinter import filedialog

      def askdirectory():
      dirname = filedialog.askdirectory()
      root.name.set(dirname)


      def dirField(root, label, rowNum):
      text = StringVar()
      text.set(label)
      dirText = Label(root, textvariable = text, height =4)
      dirText.grid(row = rowNum, column = 1)

      dirBut = Button(root, text = 'Browse', command = askdirectory)
      dirBut.grid(row = rowNum, column = 3)

      root.name = StringVar()
      adDir = Entry(root,textvariable = root.name, width = 100)
      adDir.grid(row = rowNum, column = 2)


      if __name__ == '__main__':
      root = Tk()
      root.geometry('1000x750')

      adText = "Select directory of Ads"
      userText = "Select directory of User credentials"

      adField = dirField(root, adText, 1)
      userField = dirField(root, userText, 2)

      root.mainloop()






      python tkinter






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 20 '18 at 21:36









      Vlad MVlad M

      325




      325
























          1 Answer
          1






          active

          oldest

          votes


















          1














          You should realise that you need to have each Entry have its own textvariable. Otherwise they will overlap. Have a look at my code, which should get you going.



          from tkinter import *
          from tkinter import filedialog

          path = [None, None] # Fill it with the required number of filedialogs

          def askdirectory(i):
          dirname = filedialog.askdirectory()
          path[i].set(dirname)


          def dirField(root, label, rowNum, i):
          dirText = Label(root, text=label)
          dirText.grid(row=rowNum, column=0)

          dirBut = Button(root, text='Browse', command=lambda: askdirectory(i))
          dirBut.grid(row=rowNum, column=2)

          path[i] = StringVar()
          adDir = Entry(root, textvariable=path[i], width=50)
          adDir.grid(row=rowNum, column=1)


          if __name__ == '__main__':
          root = Tk()

          adText = "Select directory of Ads"
          userText = "Select directory of User credentials"

          adField = dirField(root, adText, 0, 0)
          userField = dirField(root, userText, 1, 1)

          root.mainloop()





          share|improve this answer
























          • Thank you for your help, this fixed my problem. You are right, I didn't know the correct way to link the askdirectory function with the dirfield without it getting too messy - your solution works wonderfully.

            – Vlad M
            Nov 20 '18 at 23:07











          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%2f53401937%2fdefining-function-or-class-to-browse-and-list-multiple-directories-with-tkinter%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









          1














          You should realise that you need to have each Entry have its own textvariable. Otherwise they will overlap. Have a look at my code, which should get you going.



          from tkinter import *
          from tkinter import filedialog

          path = [None, None] # Fill it with the required number of filedialogs

          def askdirectory(i):
          dirname = filedialog.askdirectory()
          path[i].set(dirname)


          def dirField(root, label, rowNum, i):
          dirText = Label(root, text=label)
          dirText.grid(row=rowNum, column=0)

          dirBut = Button(root, text='Browse', command=lambda: askdirectory(i))
          dirBut.grid(row=rowNum, column=2)

          path[i] = StringVar()
          adDir = Entry(root, textvariable=path[i], width=50)
          adDir.grid(row=rowNum, column=1)


          if __name__ == '__main__':
          root = Tk()

          adText = "Select directory of Ads"
          userText = "Select directory of User credentials"

          adField = dirField(root, adText, 0, 0)
          userField = dirField(root, userText, 1, 1)

          root.mainloop()





          share|improve this answer
























          • Thank you for your help, this fixed my problem. You are right, I didn't know the correct way to link the askdirectory function with the dirfield without it getting too messy - your solution works wonderfully.

            – Vlad M
            Nov 20 '18 at 23:07
















          1














          You should realise that you need to have each Entry have its own textvariable. Otherwise they will overlap. Have a look at my code, which should get you going.



          from tkinter import *
          from tkinter import filedialog

          path = [None, None] # Fill it with the required number of filedialogs

          def askdirectory(i):
          dirname = filedialog.askdirectory()
          path[i].set(dirname)


          def dirField(root, label, rowNum, i):
          dirText = Label(root, text=label)
          dirText.grid(row=rowNum, column=0)

          dirBut = Button(root, text='Browse', command=lambda: askdirectory(i))
          dirBut.grid(row=rowNum, column=2)

          path[i] = StringVar()
          adDir = Entry(root, textvariable=path[i], width=50)
          adDir.grid(row=rowNum, column=1)


          if __name__ == '__main__':
          root = Tk()

          adText = "Select directory of Ads"
          userText = "Select directory of User credentials"

          adField = dirField(root, adText, 0, 0)
          userField = dirField(root, userText, 1, 1)

          root.mainloop()





          share|improve this answer
























          • Thank you for your help, this fixed my problem. You are right, I didn't know the correct way to link the askdirectory function with the dirfield without it getting too messy - your solution works wonderfully.

            – Vlad M
            Nov 20 '18 at 23:07














          1












          1








          1







          You should realise that you need to have each Entry have its own textvariable. Otherwise they will overlap. Have a look at my code, which should get you going.



          from tkinter import *
          from tkinter import filedialog

          path = [None, None] # Fill it with the required number of filedialogs

          def askdirectory(i):
          dirname = filedialog.askdirectory()
          path[i].set(dirname)


          def dirField(root, label, rowNum, i):
          dirText = Label(root, text=label)
          dirText.grid(row=rowNum, column=0)

          dirBut = Button(root, text='Browse', command=lambda: askdirectory(i))
          dirBut.grid(row=rowNum, column=2)

          path[i] = StringVar()
          adDir = Entry(root, textvariable=path[i], width=50)
          adDir.grid(row=rowNum, column=1)


          if __name__ == '__main__':
          root = Tk()

          adText = "Select directory of Ads"
          userText = "Select directory of User credentials"

          adField = dirField(root, adText, 0, 0)
          userField = dirField(root, userText, 1, 1)

          root.mainloop()





          share|improve this answer













          You should realise that you need to have each Entry have its own textvariable. Otherwise they will overlap. Have a look at my code, which should get you going.



          from tkinter import *
          from tkinter import filedialog

          path = [None, None] # Fill it with the required number of filedialogs

          def askdirectory(i):
          dirname = filedialog.askdirectory()
          path[i].set(dirname)


          def dirField(root, label, rowNum, i):
          dirText = Label(root, text=label)
          dirText.grid(row=rowNum, column=0)

          dirBut = Button(root, text='Browse', command=lambda: askdirectory(i))
          dirBut.grid(row=rowNum, column=2)

          path[i] = StringVar()
          adDir = Entry(root, textvariable=path[i], width=50)
          adDir.grid(row=rowNum, column=1)


          if __name__ == '__main__':
          root = Tk()

          adText = "Select directory of Ads"
          userText = "Select directory of User credentials"

          adField = dirField(root, adText, 0, 0)
          userField = dirField(root, userText, 1, 1)

          root.mainloop()






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 20 '18 at 22:05









          Miraj50Miraj50

          2,7351924




          2,7351924













          • Thank you for your help, this fixed my problem. You are right, I didn't know the correct way to link the askdirectory function with the dirfield without it getting too messy - your solution works wonderfully.

            – Vlad M
            Nov 20 '18 at 23:07



















          • Thank you for your help, this fixed my problem. You are right, I didn't know the correct way to link the askdirectory function with the dirfield without it getting too messy - your solution works wonderfully.

            – Vlad M
            Nov 20 '18 at 23:07

















          Thank you for your help, this fixed my problem. You are right, I didn't know the correct way to link the askdirectory function with the dirfield without it getting too messy - your solution works wonderfully.

          – Vlad M
          Nov 20 '18 at 23:07





          Thank you for your help, this fixed my problem. You are right, I didn't know the correct way to link the askdirectory function with the dirfield without it getting too messy - your solution works wonderfully.

          – Vlad M
          Nov 20 '18 at 23:07


















          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%2f53401937%2fdefining-function-or-class-to-browse-and-list-multiple-directories-with-tkinter%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

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

          How to fix TextFormField cause rebuild widget in Flutter