Я пытаюсь создать простую программу для открытия URL-адреса, если условие подходит.
Вот минимальный воспроизводимый пример.
from tkinter import *
import requests
from bs4 import BeautifulSoup
import webbrowser
import time
def call_back(event):
input_id.delete(0,END)
return None
def open_browse(url):
webbrowser.open_new(url)
win = Tk()
win.geometry("150x150")
win.title("Example")
search_btn = Button(win)
search_btn.config(text="search")
search_btn.config(width=5,height=1)
search_btn.grid(column = 2, row = 2)
def search_chr():
chr_list = ["test1","test2"]
result = [(0,"test_r_1"),(0,"test_r_2")]
var_dict = {}
num = -1
for ch in chr_list:
num += 1
var_dict["output%s" %num] = Entry(win, width = 10)
if result[0] == 0:
pass
else:
link_url = result[num][1]
print(link_url)
var_dict["o-button%s" %num] = Button(win, command=lambda aurl=link_url:open_browse(link_url))
var_dict["output"+str(num)].insert(0, "Text")
var_dict["output"+str(num)].grid(column = 0, row = 0+num, columnspan = 4, sticky=W, padx=5, pady=5)
var_dict["o-button"+str(num)].config(text="URL")
var_dict["o-button"+str(num)].grid(column = 4, row = 0+num, sticky=E, padx=5, pady=5)
var_dict["output"+str(num)].config(state="disabled")
search_btn.config(command = search_chr)
win.mainloop()
Итак, если вы запустите код, будет кнопка. И если вы нажмете на нее, появится два набора меток с текстом и кнопка с URL-адресом. Когда вы нажимаете кнопку URL, должна открываться страница просмотра с заданным URL.
Поскольку вы видите печатный текст в своем терминале, URL должен быть "test_r_1" и "test_r_2" Но, если вы нажмете каждую кнопку, все кнопки будут направлены на "test_r_2". Кажется, он каким-то образом перезаписал и предыдущий "test_r_1".
Если бы кто-нибудь мог объяснить, как заставить каждую кнопку ссылаться на каждый URL-адрес, это было бы прекрасно. Спасибо, что заглянули, и я надеюсь, что вы можете помочь мне с этим.
Я также не нашел никакой разницы, изменив это, и код вопроса, и измененный код у меня работают нормально? Я не понял ни вашего вопроса, ни этого ответа!
Что ж, я проверил еще раз, но первый код все еще отправляет неправильный URL. если вы нажмете первую кнопку в первом коде, он откроет «test_r_2» вместо «test_r_1». и если вы попробуете ту же кнопку в исправленном коде, она выдаст вам «test_r_1»
Вам действительно не нужно было менять его таким образом, вы просто должны были использовать
command=lambda aurl=link_url:open_browse(aurl)
также, как работают и другие функции.@Matiiss Спасибо! Вот чему я научился. Я не знал, как лямбда присваивает переменные в циклах. Я думал, что сработает первый, но оказалось, что мне нужно было сопоставить эти два адреса в предложенном вами коде. Большое спасибо Матисс!